Компиляция SymbolicC ++ - оператор, неоднозначный - PullRequest
2 голосов
/ 08 марта 2012

Я пытаюсь скомпилировать библиотеку 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 ]

5 голосов
/ 08 марта 2012

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

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

#include <iostream>
#include <vector>

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

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

2 голосов
/ 12 декабря 2012

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

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

#include <iomanip>

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

2 голосов
/ 08 марта 2012

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

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

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

    if (_Str[0] < _E0 || _E0 + 9 < _Str[0])
    {
        _Str2 += '-';
        ++_Off;
    }
0 голосов
/ 08 марта 2012

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

0 голосов
/ 08 марта 2012

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

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