Незаконный токен на правой стороне :: - PullRequest
46 голосов
/ 01 апреля 2010

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

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;

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

Редактировать: Также не удается использовать min (), и вывод компилятора:

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, это ранее упомянутая строка.

Ответы [ 3 ]

107 голосов
/ 01 апреля 2010

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

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

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

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

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


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

1 голос
/ 01 апреля 2010

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

#include <limits>

0 голосов
/ 05 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...