Подтвердить что ты не робот

Ошибка синтаксиса с помощью 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)

4b9b3361

Ответ 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 в проект.