std :: numeric_limits :: max的语法错误

时间:2014-12-12 11:40:11

标签: c++ visual-c++ syntax syntax-error numeric-limits

我有类结构定义如下:

#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 个答案:

答案 0 :(得分:77)

您的问题是由包含名为<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添加到编译器标志(或在包含标头之前添加到翻译单元):

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

答案 1 :(得分:7)

正如其他人所说,问题在于<WinDefs.h>(包含在<windows.h>中)是定义的宏minmax,但是如果您看到它的声明:

// <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添加到项目中。