我的类结构定义如下:
#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()' 并且编译器说:
错误 8 错误 C2059:语法错误:'::'
Error 7 error C2589: '(' : '::' 右侧的非法 token
我使用的编译器是 Visual C++ 11 (2012)
最佳答案
您的问题是由 <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
定义到编译器标志(或到翻译单元,在包含 header 之前):
#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()
关于c++ - std::numeric_limits::max 的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442885/