std :: min给出错误
#include <algorithm> #include <Windows.h> int main() { int k = std::min(3, 4); return 0; }
什么是Windows在做什么,如果我包括Windows.h我不能在Visual Studio 2005中使用std :: min。错误消息是:
error C2589: '(' : illegal token on right side of '::' error C2059: syntax error : '::'
windows.h
头文件(或更正确地windef.h
,它包含windef.h
)具有min
和max
的干扰的macros。
包括它之前你应该#define NOMINMAX
。
不需要定义任何东西,只需使用以下语法绕过macros:
(std::min)(a, b); // added parentheses around function name (std::max)(a, b);
正如其他人提到的,这些错误是由于在Windows头文件中定义的最小/最大macros。 有三种方法禁用它们。
1)在包含头文件之前#define NOMINMAX
,这通常是定义macros以影响以下头文件的一种不好的技术;
2)在编译器命令行/ IDE中定义NOMINMAX
。 这个决定的不好之处在于,如果你想发布你的源代码,你需要警告用户也这样做。
3)在使用之前,只需在代码中取消定义macros
#undef min #undef max
这可能是最便携和灵活的解决scheme。
尝试这样的事情:
#define NOMINMAX #include <windows.h>
默认情况下,windows.h将min
和max
定义为macros。 当这些扩展时,试图使用std::min
(例如)的代码最终会看起来像这样:
int k = std::(x) < (y) ? (x) : (y);
错误消息告诉你std::(x)
是不允许的。
我偶尔还是遇到了windows头文件,而且项目的NOMINMAX定义并不总是有效。 作为使用圆括号的替代方法,我有时会使types如下所示:
int k = std::min<int>(3, 4);
这也阻止了预处理器匹配min
,可以说是比括号解决方法更可读。
在我的情况下,项目没有明确包含windows.h
或windef.h
。 它使用了Boost。 所以,我通过转到项目Properties -> C/C++ -> Preprocessor
,并在Preprocessor Definitions
(VS 2013,VS 2015)中附加了NOMINMAX
来解决了这个问题。
我假设windows.h确定min是一个macros,例如
#define min(a,b) ((a < b) ? a : b)
这将解释错误消息。
对于包括windows.h在内的人来说,将下列内容放在受影响的头文件
#include windows headers ... pragma push_macro("min") pragma push_macro("max") #undef min #undef max #include headers expecting std::min/std::max ... ... pragma pop_macro("min") pragma pop_macro("max")
在源文件中只有#undef最小和最大。
#include windows headers ... #undef min #undef max #include headers expecting std::min/std::max ...
以下为我工作。
using namespace std; int k = min(3, 4);
- Expression类的目的是什么?
- 将谓词的expression式树变为另一种types
- 该请求被中止:无法创buildSSL / TLS安全通道
- 在Qt,C ++中检查文件夹是否存在(以及创build文件夹)
- 是否有可能引用一个string和一个int的variables?
- 在Visual Studio 2012中进行Googletesting
- 如何从ASP.NET中的string中去除HTML标签?
- 使用ASP.NET MVC数据types属性进行电子邮件地址validation
- 为什么安装vcredist_x86.exe不能解决SideBySide错误,当我在一台机器上开发一个EXE并在另一台机器上运行它?