c++ - Error de sintaxis con std:: numeric_limits:: max
visual-c++ syntax (2)
Como otras personas dicen que el problema es que en <WinDefs.h>
(incluido por <windows.h>
) se define macroses min
y max
, pero si verá su declaración:
// <WinDefs.h>
#ifndef NOMINMAX
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */
verá que si se define una macro NOMINMAX
entonces WinDefs.h
no producirá estas macros.
Es por eso que sería mejor agregar un definir NOMINMAX
al proyecto.
Tengo definición de estructura de clase de la siguiente manera:
#include <limits>
struct heapStatsFilters
{
heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
{
minMax[0] = minValue_; minMax[1] = maxValue_;
}
size_t minMax[2];
};
El problema es que no puedo usar ''std :: numeric_limits :: max ()'' y el compilador dice:
Error 8 error C2059: syntax error : ''::''
Error 7 error C2589: ''('' : illegal token on right side of ''::''
El compilador que estoy usando es Visual C ++ 11 (2012)
Su problema es causado por el archivo de encabezado <Windows.h>
que incluye definiciones de macro denominadas max
y min
:
#define max(a,b) (((a) > (b)) ? (a) : (b))
Al ver esta definición, el preprocesador reemplaza el identificador max
en la expresión:
std::numeric_limits<size_t>::max()
por la definición de la macro, lo que finalmente lleva a la sintaxis no válida:
std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
reportado en el error del compilador: ''('' : illegal token on right side of ''::''
.
Como solución alternativa, puede agregar la definición de NOMINMAX
a los indicadores del compilador (o a la unidad de traducción, antes de incluir el encabezado):
#define NOMINMAX
o envuelva la llamada al max
con paréntesis, lo que impide la expansión de la macro:
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
o #undef max
antes de llamar a numeric_limits<size_t>::max()
:
#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()