标准::numeric_limits::max的语法错误
Syntax error with std::numeric_limits::max
我有如下类结构定义:
#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)
您的问题是由包含名为 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()
正如其他人所说,问题是在<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
的原因。
相关文章:
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 我该怎么做才能摆脱使用命名空间时的语法错误?
- 如何摆脱错误c2061;语法错误 cout?
- 语法错误:D3DX10Core 中的标识符'TEXTMETRICA'
- 错误 C2146:语法错误:标识符"A1"之前缺少","
- main.cpp(11):错误 C2059:语法错误:"字符串"
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 如何修复此 FSM C++语法错误 C3867
- 函数错误 C2059:语法错误:'>'不起作用
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- c++default-int中的语法错误
- "pip install openexr"上的语法错误:错误的编译器?
- 为什么我收到语法错误:在"*"之前缺少";"
- 错误 C2059:语法错误:从结构成员声明'constant'
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 我正在调试这个C++程序.编译器不再显示语法错误,但存在隐藏的逻辑错误