hid*_*yat 99 c++ visual-studio-2005
#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是Windows正在做,如果我包括Windows.h我不能在Visual Studio 2005中使用std :: min.错误消息是:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 143
该windows.h
头文件(或更正确地说windef.h
,它包括反过来)具有用于宏min
和max
被干扰.
你应该#define NOMINMAX
在加入它之前.
Pol*_*esh 76
无需定义任何内容,只需使用以下语法绕过宏:
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
Run Code Online (Sandbox Code Playgroud)
Gen*_*yev 25
正如其他人所提到的,错误是由于在windows标题中定义的最小/最大宏.有三种方法可以禁用它们.
1)#define NOMINMAX
在包含头之前,这通常是一种定义宏的不良技术,以便影响以下头部;
2)NOMINMAX
在编译器命令行/ IDE中定义.关于这个决定的不好的部分是,如果你想运送你的资源,你需要警告用户也这样做;
3)在使用代码之前简单地取消定义代码中的宏
#undef min
#undef max
Run Code Online (Sandbox Code Playgroud)
这可能是最便携和灵活的解决方案.
Eri*_*rik 18
偶尔使用Windows标题仍然有问题,NOMINMAX的项目范围定义似乎并不总是有用.作为使用括号的替代方法,我有时会将类型显式化为:
int k = std::min<int>(3, 4);
Run Code Online (Sandbox Code Playgroud)
这也会阻止预处理器min
与括号解决方法匹配,并且可以说比括号更具可读性.
Jer*_*fin 15
尝试这样的事情:
#define NOMINMAX
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)
默认情况下,windows.h定义min
和max
作为宏.当这些扩展时,尝试使用的代码std::min
(例如)将最终看起来像这样:
int k = std::(x) < (y) ? (x) : (y);
Run Code Online (Sandbox Code Playgroud)
错误消息告诉您std::(x)
不允许.
小智 5
就我而言,项目没有包括windows.h
或windef.h
明确。它正在使用Boost。所以,我首先要对项目解决了这一问题Properties -> C/C++ -> Preprocessor
,并附加NOMINMAX
在Preprocessor Definitions
(VS 2013,2015年VS)。