2011-08-12 89 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沒有明確的限定條件。