#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
如果我包含Windows.h,Windows在做什么?我无法在Visual Studio 2005中使用std::min
。错误消息是:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
windows.h
头文件(或更正确的是,它依次包含的windef.h
具有干扰的min
和max
的宏。
您应该在包含#define NOMINMAX
之前将其添加。
要解决此问题,我只创建了名为fix_minmax.h
的头文件无
无需定义任何内容,只需使用以下语法绕过宏:
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
正如其他人提到的,该错误是由于Windows标头中定义的最小/最大宏引起的。有三种禁用它们的方法。
1] #define NOMINMAX
在包含头之前,通常这是定义宏以影响以下头的糟糕技术;
2)在编译器命令行/ IDE中定义NOMINMAX
。这个决定的坏处在于,如果您想运送自己的货源,则需要警告用户也要这样做;
3)在使用它们之前,只需在代码中取消定义宏
#undef min
#undef max
这可能是最便携式和灵活的解决方案。
我有时仍然会遇到Windows标头的麻烦,并且NOMINMAX的项目范围的定义似乎并不总是有效。作为使用括号的替代方法,有时我会像这样使类型显式:
int k = std::min<int>(3, 4);
这也将阻止预处理器与min
匹配,并且可以说比括号解决方法更具可读性。
尝试这样的事情:
#define NOMINMAX
#include <windows.h>
默认情况下,windows.h将min
和max
定义为宏。展开这些代码后,尝试使用std::min
的代码将最终看起来像这样:
int k = std::(x) < (y) ? (x) : (y);
错误消息告诉您不允许使用std::(x)
。
在我的情况下,项目未明确包含windows.h
或windef.h
。它正在使用Boost。因此,我通过转到项目Properties -> C/C++ -> Preprocessor
,并在NOMINMAX
中添加Preprocessor Definitions
(VS 2013,VS 2015)解决了该问题。
#define NOMINMAX
对于包括windows.h的人,在有效的标题中放入以下内容:
我假设windows.h确实将min定义为宏,例如等