50

我的类结构定义如下:

#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)

4

2 回答 2

118

您的问题是由包含名为and<Windows.h>的宏定义的头文件引起的:maxmin

#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()
于 2014-12-12T11:58:39.173 回答
8

As other people say the problem is that in <WinDefs.h> (included by <windows.h>) is defined macroses min and max, but if you'll see it's declaration:

// <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 */

you'll see that if there is defined a macro NOMINMAX then WinDefs.h will not produce these macroses.

That's why it would be better to add a define NOMINMAX to project.

于 2014-12-12T12:29:41.977 回答