C++ std::max-需要一个标识符

C++ std::max-需要一个标识符,c++,C++,我对std::max有问题。我想不出来 int border = 35; int myInt = 2; int myOtherInt = 3; int z = std::max(myInt + 2 * border, myOtherInt + 2 * border); 我已经包括了算法标准标题。当我将鼠标移到max上时,我得到: 错误:需要一个标识符 编译错误为: 错误C2589:”(“:在右侧的非法令牌::” 错误C2059:语法错误:::' 有什么问题吗?我想说要么max是#将定义为其他内

我对
std::max
有问题。我想不出来

int border = 35;
int myInt = 2;
int myOtherInt = 3;
int z = std::max(myInt + 2 * border, myOtherInt + 2 * border);
我已经包括了算法标准标题。当我将鼠标移到max上时,我得到:

错误:需要一个标识符

编译错误为:

错误C2589:
”(“
:在
右侧的非法令牌::”

错误C2059:语法错误:
::'


有什么问题吗?

我想说要么
max
#将
定义为其他内容,要么你需要通过
std::max
显式调用模板。你试过使用
::std::max
吗?如果不起作用,你的std名称空间就有问题了。

冒险猜测,因为你是使用VC++–将其置于任何
#include
s之前:

#define NOMINMAX
windows.h
定义了名为
min
max
的宏,如下所示:

#define min(a,b)            (((a) < (b)) ? (a) : (b))
#define max(a,b)            (((a) > (b)) ? (a) : (b))
定义最小值(a,b)((a)<(b))?(a):(b)) #定义最大值(a,b)((a)>(b))?(a):(b))

Windows SDK包含了这些宏,因为在C++被标准化之前,但是它们明显地破坏了C++标准库,所以可以定义<代码> NoMINMAX < /Cord>宏,以防止它们被定义。


一般来说,如果使用C++(与C相反),包括“代码> Windows .H./Cube”,首先定义“代码> NoMINMAX < /C> > .P/>,如果您在VC++上,可以在使用任何代码头之前使用<代码>定义NEMINMAX < /C> >,或者做<代码>(STD::Max)(MyTIN+2*Palm,MyOntIt +2*边)< /Calp>

< P>“使用”声明(参见)是解决这个问题的另一种方法:

int border = 35;
int myInt = 2;
int myOtherInt = 3;
using std::max;
int z = max(myInt + 2 * border, myOtherInt + 2 * border);

它允许在没有明确限定的情况下使用std::max。

是否包含
?是否包含
?OP sez:“我包含了算法标准标题。”您能提供一个我们可以尝试编译的完整示例吗?您的程序足够短。不相关,但如果您编写
std::max(myInt,myOtherInt),它看起来会更短,更易于阅读+2*border;
当我添加这个时,它看起来像是在编译。但是为什么?这是一个bug吗?@Jay:显然是
本身通过定义名为
min
max
的宏把一切都搞砸了。祝贺微软!更多。谢谢你的解释。按照我的理解,Windows.h定义了这些宏。然后是在C++标准库中,在命名空间STD中,定义了函数模板T max(const t& x,const t& y)。因此,当涉及到这一行时,Max宏和通用函数max存在混淆。唯一奇怪的是,如果不包含WINDOWS.H(因此冲突不应该发生)。我仍然不能使用std::max。也许其他标准的头文件包括Windows.h,因为我的头文件都没有!@Jay:如果你使用的是MFC或任何其他GUI框架,那么
Windows.h
总是会包含在某个地方。哇,这太棒了!正是我想要的。我试图使用
std::numeric\u limits::max()
和愚蠢的windows.h导致预处理器插入std::max()代替
max()
。只需执行
(std::numeric\u limits::max)()
足以避免预处理器做错误的事情。我不想做NOMINMAX的事情,因为我担心windows.h在定义之前可能会被包含,更不用说我自己的很多文件都包含windows.h。谢谢!