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。谢谢!