2011-08-12 24 views
27

Tengo un problema con std::max. No puedo resolverlo.std :: max - esperaba un identificador

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

He incluido el encabezado estándar del algoritmo. Cuando el cursor sobre max, estoy consiguiendo:

Error: expected an identifier

Y unos errores de compilación de:

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

¿Qué le pasa?

+0

¿Has incluido ''? ¿Está incluyendo ''? –

+1

OP sez: "He incluido el encabezado estándar de algoritmo". – mkb

+2

¿Puede incluir un ejemplo completo que podamos intentar compilar? Tu programa es lo suficientemente corto para eso. – hugomg

Respuesta

44

aventurar una conjetura, ya que estás usando VC++ – poner esto antes de que cualquier #include s:

#define NOMINMAX 

windows.h define macros nombrados min y max así:

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

El SDK de Windows ha contenía estas macros desde antes de que C++ estuviera estandarizado, pero como obviamente causan estragos en la biblioteca estándar de C++, se puede definir la macro NOMINMAX para evitar ellos de ser definidos.

Como regla general, si usted está usando C++ (en oposición a C) e incluyendo windows.h, siempre definen NOMINMAX primero.

+1

Parece que se compila cuando agrego esto. ¿Pero por qué? ¿Es esto un error? – Jay

+2

@Jay: aparentemente es '' el que enreda todo definiendo macros llamadas 'min' y' max'. ¡Felicidades a Microsoft! Más [aquí] (http://stackoverflow.com/questions/4913922/possible-problems-with-nominmax-on-visual-c/4914108#4914108). – jweyrich

+1

@Jay: respuesta actualizada con una explicación. – ildjarn

1

Yo diría que max es #define 's a algo más o que necesita invocar explícitamente la plantilla a través de std::max<int>.

0

¿Ha intentado usar ::std::max en su lugar? Si esto no funciona, algo está jugando con tu espacio de nombres estándar.

13

Si estás en VC++, puede utilizar #define NOMINMAX antes de incluir ninguna cabecera, o hacer (std::max)(myInt + 2 * border, myOtherInt + 2 * border)

+3

¡Guau, esto es increíble! Justo lo que estaba buscando. Estaba intentando usar 'std :: numeric_limits :: max()' y el estúpido windows.h causaba que el preprocesador insertara std :: max() en lugar de 'max()'. Simplemente haciendo '(std :: numeric_limits :: max)()' es suficiente para evitar que el preprocesador haga algo incorrecto. No quería hacer lo de NOMINMAX porque me preocupa windows.h podría incluirse antes de que se defina, sin mencionar que muchos de mis propios archivos incluyen windows.h. ¡Gracias! – PolyMesh

1

El "por medio de" declaración (ver using Declaration) es otra manera de solucionar este problema:

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

Permite usar std :: max sin calificación explícita.

Cuestiones relacionadas