Подтвердить что ты не робот

Незаконный токен с правой стороны::

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

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

4b9b3361

Ответ 1

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

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

EDIT:

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

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


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

Ответ 2

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

#include <limits>

Ответ 3

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

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