std :: min给出了错误

时间:2011-02-15 14:26:55

标签: c++ visual-studio-2005

#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 : '::'

10 个答案:

答案 0 :(得分:138)

windows.h标头文件(或更准确地说,它依次包含windef.h)具有minmax的干扰宏。

在加入之前你应该#define NOMINMAX

答案 1 :(得分:72)

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

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);

答案 2 :(得分:22)

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

1)#define NOMINMAX在包含标题之前,这通常是定义宏以便影响以下标题的错误技巧;

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

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

#undef min
#undef max

这可能是最便携,最灵活的解决方案。

答案 3 :(得分:16)

我偶尔会遇到有关Windows标题的麻烦,而NOMINMAX的项目范围定义似乎并不总是有用。作为使用括号的替代方法,我有时会将类型显式化为:

int k = std::min<int>(3, 4);

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

答案 4 :(得分:15)

尝试这样的事情:

#define NOMINMAX
#include <windows.h>

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

int k = std::(x) < (y) ? (x) : (y);

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

答案 5 :(得分:4)

就我而言,项目未明确包含windows.hwindef.h。它正在使用Boost。所以,我通过转到项目Properties -> C/C++ -> Preprocessor并在NOMINMAX(VS 2013,VS 2015)中附加 Preprocessor Definitions 来解决了这个问题。

答案 6 :(得分:2)

#define NOMINMAX

是抑制max和min的宏定义的技巧

http://support.microsoft.com/kb/143208

答案 7 :(得分:2)

对于包括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 min和max。

#include windows headers ...

#undef min
#undef max

#include headers expecting std::min/std::max ...

答案 8 :(得分:1)

我假设windows.h确实将min定义为宏,例如像

#define min(a,b)  ((a < b) ? a : b)

这可以解释错误信息。

答案 9 :(得分:-1)

要解决此问题,我只需创建名为fix_minmax.h 的头文件,不包含包含警卫

#ifdef max
    #undef max
#endif

#ifdef min
    #undef min
#endif

#ifdef MAX
    #undef MAX
#endif
#define MAX max

#ifdef MIN
   #undef MIN
#endif
#define MIN min

#include <algorithm>
using std::max;
using std::min;

基本用法是这样的。

// Annoying third party header with min/max macros
#include "microsoft-mega-api.h"
#include "fix_minmax.h"

这种方法的优点在于它适用于各种包含文件或部分代码。这也可以节省您处理依赖min / max宏的代码或库的时间