Компиляция 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 += '-';
}