Недопустимый маркер на правой стороне::

У меня есть следующее объявление шаблона:

template <typename T>
   void IterTable(int&                       rIdx,
                  std::vector<double>&       rVarVector,
                  const std::vector<T>&      aTable,
                  const T                    aValue,
                  T              aLowerBound = -(std::numeric_limits<T>::max()), //illegal token on right side of '::' shows here
                  bool                       aLeftOpen = true) const;

Который бросает недопустимую маркерную ошибку, как отмечено на строке с "-(станд.:: numeric_limits:: макс. ())". Я получил этот код от некоторого старого источника Linux, который я пытаюсь скомпилировать в Windows. Какая-либо идея, какова проблема?

Править: Это также приводит минуту использования к сбою (), и выход компилятора:

Error   92  error C2589: '::' : illegal token on right side of '::' c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL

Error   93  error C2059: syntax error : '::'    c:\projects\r&d\prepaydll\include\cfcdefault.h  216 PrepayDLL

Строка 216, строка, ранее упомянутая.

48
задан Adam Haile 1 April 2010 в 04:21
поделиться

3 ответа

Я предполагаю, что max был сделан макросом. Это происходит в какой-то момент внутри windows.h .

Определите NOMINMAX перед включением, чтобы запретить windows.h это делать.

РЕДАКТИРОВАТЬ:

Я все еще уверен, что это ваша проблема. (Если исключить , это приведет к другой ошибке). Поместите #undef max и #undef min непосредственно перед функцией и повторите попытку. Если это исправит, значит, я был прав, и ваш NOMINMAX не определен должным образом. (Добавьте его как настройку проекта.)

Вы также можете предотвратить расширение макроса с помощью: (std :: numeric_limits :: max) () .


Кстати, почему бы не выполнить std :: numeric_limits :: min () вместо отрицания максимального значения?

116
ответ дан 7 November 2019 в 12:16
поделиться

Похоже, вам нужно:

#include

2
ответ дан 7 November 2019 в 12:16
поделиться

Я написал «тестовую оснастку» с тривиальной структурой, содержащей объявление вашего метода (и ничего больше), и #included и , и вызвал (и, таким образом, создал экземпляр) метод, где T был int , и он скомпилировался отлично, как в Visual Studio 2008 Express. в Windows Vista и с GCC 4.2.4 в Linux 2.6.

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

0
ответ дан 7 November 2019 в 12:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: