std :: min给出了错误

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,它包括反过来)具有用于宏minmax被干扰.

你应该#define NOMINMAX在加入它之前.

  • MACROS是邪恶的原因之一.:d (24认同)
  • 我使用了项目范围/ D"NOMINMAX" (7认同)

Pol*_*esh 76

无需定义任何内容,只需使用以下语法绕过宏:

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
Run Code Online (Sandbox Code Playgroud)

  • 我不完全确定引擎盖下的所有魔法,但我相信宏解析器正在寻找完全替换“min(”,因此宏解析器忽略“min)(”。并且函数名称被包裹无意义的 () 不会导致宏之外的任何问题。 (3认同)
  • 你能解释一下为什么魔法周围的括号可以打败邪恶的宏!?凉爽的 (2认同)
  • 顶一下先生! (2认同)

Gen*_*yev 25

正如其他人所提到的,错误是由于在windows标题中定义的最小/最大宏.有三种方法可以禁用它们.

1)#define NOMINMAX在包含头之前,这通常是一种定义宏的不良技术,以便影响以下头部;

2)NOMINMAX在编译器命令行/ IDE中定义.关于这个决定的不好的部分是,如果你想运送你的资源,你需要警告用户也这样做;

3)在使用代码之前简单地取消定义代码中的宏

#undef min
#undef max
Run Code Online (Sandbox Code Playgroud)

这可能是最便携和灵活的解决方案.

  • 选项 1 的另一个问题是它并不总是有效。其他地方可能包含其他实际需要它的窗口标题,例如 gdiplus.h。在这种情况下,选项 3 可能是您唯一的希望。 (2认同)

Eri*_*rik 18

偶尔使用Windows标题仍然有问题,NOMINMAX的项目范围定义似乎并不总是有用.作为使用括号的替代方法,我有时会将类型显式化为:

int k = std::min<int>(3, 4);
Run Code Online (Sandbox Code Playgroud)

这也会阻止预处理器min与括号解决方法匹配,并且可以说比括号更具可读性.

  • 我同意,这是最好的解决方案.当我看到有人打败了我时,我才回来再给出一个答案. (3认同)

Jer*_*fin 15

尝试这样的事情:

#define NOMINMAX
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)

默认情况下,windows.h定义minmax作为宏.当这些扩展时,尝试使用的代码std::min(例如)将最终看起来像这样:

int k = std::(x) < (y) ? (x) : (y);
Run Code Online (Sandbox Code Playgroud)

错误消息告诉您std::(x)不允许.


小智 5

就我而言,项目没有包括windows.hwindef.h明确。它正在使用Boost。所以,我首先要对项目解决了这一问题Properties -> C/C++ -> Preprocessor,并附加NOMINMAXPreprocessor Definitions(VS 2013,2015年VS)。