mmo*_*jab 38 c++ syntax syntax-error visual-c++ 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];
};
Run Code Online (Sandbox Code Playgroud)
问题是我不能使用'std :: numeric_limits :: max()'并且编译器说:
Error 8 error C2059: syntax error : '::'
Error 7 error C2589: '(' : illegal token on right side of '::'
我使用的编译器是Visual C++ 11(2012)
Pio*_*cki 86
你的问题是由原因引起的<Windows.h>,包括宏定义命名的头文件max和min:
#define max(a,b) (((a) > (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)
看到此定义,预处理器将替换max表达式中的标识符:
std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)
通过宏定义,最终导致语法无效:
std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)
报告编译错误:'(' : illegal token on right side of '::'.
作为一种变通方法,您可以将NOMINMAXdefine 添加到编译器标志(或在包含标头之前添加到翻译单元):
#define NOMINMAX
Run Code Online (Sandbox Code Playgroud)
或者max用括号括起调用,这会阻止宏扩展:
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
Run Code Online (Sandbox Code Playgroud)
或#undef max致电之前numeric_limits<size_t>::max():
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)
至于其他人说的问题是,在<WinDefs.h>(由包含<windows.h>)定义macroses 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 */
Run Code Online (Sandbox Code Playgroud)
你会看到,如果定义了一个宏,NOMINMAX那么WinDefs.h就不会生成这些宏.
这就是为什么最好NOMINMAX为项目添加一个定义.