2011-08-12 36 views
27

Mam problem z std::max. Nie mogę tego rozgryźć.std :: max - oczekiwano identyfikatora

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

Zawarłem standardowy nagłówek algorytmu. Kiedy myszy na max, ja dostaję:

Error: expected an identifier

oraz kompilacji błędy:

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

Co jest nie tak?

+0

Czy włączyłeś ''? Czy włączasz ''? –

+1

OP sez: "Zawarłem standardowy nagłówek algorytmu." – mkb

+2

Czy możesz podać pełny przykład, który możemy próbować skompilować? Twój program jest na to wystarczająco krótki. – hugomg

Odpowiedz

44

Hazarding przypuszczenie, ponieważ używasz VC++ – umieścić to przed wszelkimi #include s:

#define NOMINMAX 

windows.h definiuje makra o nazwie min i max tak:

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

Windows SDK zawierał te makra od czasu standaryzacji C++, ale ponieważ oczywiście spustoszyło standardową bibliotekę C++, można zdefiniować makro NOMINMAX, aby zapobiec ich z definicji.

Co do zasady, jeśli używasz C++ (w przeciwieństwie do C) i tym windows.h, zawsze określić NOMINMAX pierwszy.

+1

Wygląda na to, że kompiluje się, gdy dodaję to. Ale dlaczego? Czy to błąd? – Jay

+2

@Jay: najwyraźniej jest to '' samo, które przenika wszystko przez zdefiniowanie makr o nazwach 'min' i' max'. Gratulacje dla Microsoft! Więcej [tutaj] (http://stackoverflow.com/questions/4913922/possible-problems-w-nominmax-on-visual-c/4914108#4914108). – jweyrich

+1

@Jay: Odpowiedź zaktualizowana z wyjaśnieniem. – ildjarn

1

Powiedziałbym, że albo max jest #define do czegoś innego lub trzeba jawnie wywołać szablon przez std::max<int>.

0

Czy próbowałeś już użyć ::std::max? Jeśli to nie działa, coś miesza się z twoją std namespace.

13

Jeśli jesteś na VC++, można użyć #define NOMINMAX przed tym żadnych nagłówków, czy (std::max)(myInt + 2 * border, myOtherInt + 2 * border)

+3

Wow, to jest niesamowite! Właśnie tego szukałem. Próbowałem użyć 'std :: numeric_limits :: max()', a głupie windows.h powodowało, że preprocesor wstawiał std :: max() zamiast 'max()'. Samo zrobienie '' (std :: numeric_limits :: max)() 'wystarczy, aby zepsuć preprocesor przed robieniem niewłaściwej rzeczy. Nie chciałem robić rzeczy NOMINMAX, bo martwię się, że windows.h może zostać włączony zanim zostanie zdefiniowany, nie mówiąc o wielu moich własnych plikach to windows.h. Dziękuję Ci! – PolyMesh

1

„Korzystanie” oświadczenie (patrz using Declaration) jest kolejnym sposobem, aby obejść ten problem:

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

Pozwala na używanie std :: max bez wyraźnej kwalifikacji.

Powiązane problemy