Синтаксическая ошибка с 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 проэктировать.

Другие вопросы по тегам