artem
artem

Reputation: 16818

Compiling SymbolicC++ - operator , is ambiguous

I'm trying to compile the SymbolicC++ library in VC++ 2010 Express (there is special VS project in the distribution), but it gives a lot of errors in system headers, related to operator,. For example:

1>C:\Program Files\Microsoft Visual Studio 10.0\VC\include\xlocmon(410): error C2593: 'operator ,' is ambiguous

For this code in a system header:

if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
    _Str2 += '-', ++_Off;

Why? How to compile it?

Upvotes: 2

Views: 1267

Answers (5)

dharmatech
dharmatech

Reputation: 9547

Here's another workaround which avoids having to modify <xlocmon>.

The dependency on <xlocmon> is via verylong.h which includes <iomanip> which in turn includes <xlocmon>. In verylong.h, comment out the line:

#include <iomanip>

After doing this, the build completes successfully on my system (Windows 7, Visual C++ 2010 Express).

Upvotes: 2

user7116
user7116

Reputation: 64148

Apparently, SymbolicC++ has overloaded operator, in such a manner that a downstream include has been affected.

You should reorder your includes such that SymbolicC++'s include comes last:

#include <iostream>
#include <vector>

// don't want to monkey with our other headers
#include "symbolicc++.h"

This isn't to say the code in the <xlocmon> header isn't suspect, that sort of abuseusage of the comma operator is asking for trouble.

Upvotes: 5

Lundin
Lundin

Reputation: 215360

The comma operator doesn't make any sense in 90% of the cases. The solution is to hit whoever wrote that code in the head with a blunt object, then rewrite it as:

if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
{
  _Off++;
  _Str2 += '-';
}

Upvotes: 0

Ernest Friedman-Hill
Ernest Friedman-Hill

Reputation: 81734

We have no idea what their operator, is doing, so this may well not be valid, but that's a weird way to do things -- the following is equivalent and less weird:

    if (_Str[0] < _E0 || _E0 + 9 < _Str[0]) {
        _Str2 += '-';
        ++_Off;
    }

Upvotes: 0

Blindy
Blindy

Reputation: 67584

When in doubt, add parentheses:

    if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
        (_Str2 += '-'), ++_Off;

Or simply write proper C++ code:

    if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
    {
        _Str2 += '-';
        ++_Off;
    }

Upvotes: 2

Related Questions