我有类结构定义如下:
#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)
答案 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>
中)是定义的宏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
添加到项目中。