2011-08-12 92 views
27

我遇到了问题std::max。我无法弄清楚。std :: max - 预期标识符

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

我已经包含算法标准头。当我鼠标移到最大,我得到:

Error: expected an identifier

和编译错误:

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

有什么不对?

+0

您是否包含''?你是否包括''? –

+1

OP sez:“我已经包含算法标准头文件。” – mkb

+2

您能否包含我们可以尝试编译的完整示例?你的程序足够短。 – hugomg

回答

44

Hazarding猜测,因为你使用VC++ –把在此之前的任何#include S:

#define NOMINMAX 

windows.h定义了一个名为minmax像这样的宏:

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

Windows SDK中有包含这些宏,因为在C++被标准化之前,但因为它们显然对C++标准库造成严重破坏,所以可以定义宏以防止他们从被定义。通常,如果您使用的是C++(而不是C),并且包括windows.h,总是首先定义NOMINMAX

+1

它看起来像它在我添加它时编译。但为什么?这是一个错误? – Jay

+2

@Jay:显然它是''本身,它通过定义名为'min'和'max'的宏来混淆所有东西。恭喜微软!更多[这里](http://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c/4914108#4914108)。 – jweyrich

+1

@Jay:答案更新了解释。 – ildjarn

1

我会说,要么max#define的其他东西,或者你需要通过std::max<int>显式调用模板。

0

你试过用::std::max来代替吗?如果这不起作用,那么你的std命名空间就会出现混乱。

13

如果你在VC++中,你既可以使用#define NOMINMAX包括任何头之前,或做(std::max)(myInt + 2 * border, myOtherInt + 2 * border)

+3

哇,太棒了!正是我在找的东西。我试图使用'std :: numeric_limits :: max()',而愚蠢的windows.h导致预处理器插入std :: max()来代替'max()'。简单地执行'(std :: numeric_limits :: max)()'就足以让预处理器不做错误的事情。我不想做NOMINMAX的事情,因为我担心windows.h可能会在它定义之前被包含,更不用说我自己的很多文件包含windows.h。谢谢! – PolyMesh

1

“使用”的声明(见using Declaration)是另一种方法来解决这个问题:

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

它允许使用std :: max没有明确的限定条件。