Незаконный токен с правой стороны::
У меня есть следующее объявление шаблона:
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 - это упомянутая ранее строка.
Ответы
Ответ 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.
Я предлагаю попытаться создать только минимальное количество кода с "проблемой" в нем, и если это действительно произойдет, добавьте обратно в остальную часть вашего проекта, пока он не сломается, тогда вы узнаете, что вызвало его.