Компиляция SymbolicC++ - оператор, неоднозначный

Я пытаюсь скомпилировать библиотеку SymbolicC++ в VC++ 2010 Express (в дистрибутиве есть специальный VS-проект), но она дает много ошибок в системных заголовках, связанных с operator,, Например:

1> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ xlocmon (410): ошибка C2593: "оператор" является неоднозначным

Для этого кода в системном заголовке:

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

Зачем? Как это скомпилировать?

5 ответов

Решение

Судя по всему, SymbolicC++ перегружен operator, таким образом, что последующее включение было затронуто.

Вы должны изменить порядок своих включений так, чтобы включение SymbolicC++ было последним:

#include <iostream>
#include <vector>

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

Это не значит, что код в <xlocmon> Заголовок не подозревает, что такое злоупотребление оператором запятой вызывает проблемы.

Если сомневаетесь, добавьте скобки:

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

Или просто написать правильный код C++:

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

Вот еще один обходной путь, который позволяет избежать необходимости изменять <xlocmon>,

Зависимость от <xlocmon> через verylong.h который включает в себя <iomanip> что в свою очередь включает <xlocmon>, В verylong.h, закомментируйте строку:

#include <iomanip>

После этого сборка успешно завершается в моей системе (Windows 7, Visual C++ 2010 Express).

Мы понятия не имеем, что их operator, делает, так что это может быть недопустимо, но это странный способ сделать что-то - следующее эквивалентно и менее странно:

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

Оператор запятой не имеет смысла в 90% случаев. Решение состоит в том, чтобы поразить любого, кто написал этот код в голове тупым объектом, а затем переписать его следующим образом:

if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
{
  _Off++;
  _Str2 += '-';
}
Другие вопросы по тегам