Ошибка синтаксиса с помощью std:: numeric_limits:: max
У меня есть определение структуры структуры следующим образом:
#include <limits>
struct heapStatsFilters
{
heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
{
minMax[0] = minValue_; minMax[1] = maxValue_;
}
size_t minMax[2];
};
Проблема в том, что я не могу использовать 'std:: numeric_limits:: max()', и компилятор говорит:
Error 8 error C2059: syntax error : '::'
Error 7 error C2589: '(' : illegal token on right side of '::'
Компилятор, который я использую, - это Visual С++ 11 (2012)
Ответы
Ответ 1
Вероятно, ваша проблема вызвана заголовком <Windows.h>
, который определяет его собственные макросы с именем max
и min
.
В качестве обходного пути вы можете либо #undef max
перед вызовом numeric_limits<size_t>::max()
:
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
или завершите вызов скобкой (предотвратите расширение макроса):
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
Ответ 2
Как говорят другие люди, проблема заключается в том, что в <WinDefs.h>
(включенном <windows.h>
) определены макросы min
и max
, но если вы увидите это объявление:
// <WinDefs.h>
#ifndef NOMINMAX
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */
вы увидите, что если макрокоманда NOMINMAX
определена, то WinDefs.h
не будет выдавать эти макросы.
Вот почему было бы лучше добавить проект NOMINMAX
в проект.