我有如下的类结构定义:
#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)
发布于 2014-12-12 19:58:39
您的问题是由包含名为max
和min
的宏定义的<Windows.h>
头文件引起的
#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)()
// ^ ^
或在调用numeric_limits<size_t>::max()
之前使用#undef max
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
发布于 2014-12-12 20:29:42
正如其他人所说的,问题是在<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
会更好。
https://stackoverflow.com/questions/27442885
复制相似问题