У меня есть следующее объявление шаблона:
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, строка, ранее упомянутая.
Я предполагаю, что max
был сделан макросом. Это происходит в какой-то момент внутри windows.h
.
Определите NOMINMAX
перед включением, чтобы запретить windows.h
это делать.
Я все еще уверен, что это ваша проблема. (Если исключить
, это приведет к другой ошибке). Поместите #undef max
и #undef min
непосредственно перед функцией и повторите попытку. Если это исправит, значит, я был прав, и ваш NOMINMAX
не определен должным образом. (Добавьте его как настройку проекта.)
Вы также можете предотвратить расширение макроса с помощью: (std :: numeric_limits
.
Кстати, почему бы не выполнить std :: numeric_limits
вместо отрицания максимального значения?
Я написал «тестовую оснастку» с тривиальной структурой, содержащей объявление вашего метода (и ничего больше), и #included
и
, и вызвал (и, таким образом, создал экземпляр) метод, где T
был int
, и он скомпилировался отлично, как в Visual Studio 2008 Express. в Windows Vista и с GCC 4.2.4 в Linux 2.6.
Я предлагаю попытаться создать только минимальный объем кода с «проблемой» в нем, и если это действительно произойдет, добавьте обратно в остальную часть вашего проекта, пока он не сломается, тогда вы узнаете, чем это вызвано.