Синтаксическая ошибка с 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 C++ 11 (2012)
2 ответа
Ваша проблема вызвана <Windows.h>
заголовочный файл, который включает определения макросов с именем max
а также min
:
#define max(a,b) (((a) > (b)) ? (a) : (b))
Видя это определение, препроцессор заменяет max
идентификатор в выражении:
std::numeric_limits<size_t>::max()
по определению макроса, что в итоге приводит к неверному синтаксису:
std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
сообщили об ошибке компилятора: '(' : illegal token on right side of '::'
,
В качестве обходного пути вы можете добавить NOMINMAX
определить для флагов компилятора (или для модуля перевода, прежде чем включать заголовок):
#define NOMINMAX
или оберните звонок max
с круглой скобкой, которая предотвращает расширение макроса:
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
или же #undef max
перед звонком numeric_limits<size_t>::max()
:
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
Как говорят другие люди, проблема в том, что в <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
проэктировать.