Tengo clase struct definición 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 utilizando es el Visual C++ 11 (2012)
- No se pueden reproducir. Intentar incluyendo
<cstddef>
. - No estoy utilizando sexual para size_t en mi código. Debo hacer eso?
- Compilador que se está utilizando? Estoy utilizando Visual C++ 11 (2012)
- compruebe si usted tiene algún
#define max(a,b)
o similar, o añadir#undef max
antes destruct ifxHeapStatsFilters
para comprobar si es el tema aquí - sí! tiene usted razón! funcionó! 🙂
El problema es causado por la
<Windows.h>
archivo de encabezado que incluye las definiciones de macro denominadamax
ymin
:Ver a esta definición, el preprocesador sustituye a la
max
identificador de la expresión:por la definición de macro, llevando eventualmente a la sintaxis no válida:
reportados en el error del compilador:
'(' : illegal token on right side of '::'
.Como una solución, puede agregar el
NOMINMAX
definir a los parámetros del compilador (o a la unidad de traducción, antes de incluir el encabezado):o envoltura de la llamada a
max
con paréntesis, lo que impide la expansión de macro:o
#undef max
antes de llamar anumeric_limits<size_t>::max()
:NOMINMAX
podría causar nuevos problemas como la min/max macros son requerido/utilizado/espera por un montón de otras Ventanas encabezados…Como otras personas dicen que el problema es que en
<WinDefs.h>
(incluido por<windows.h>
) se define macrosmin
ymax
, pero si vas a ver la declaración:vas a ver que si no se define una macro
NOMINMAX
luegoWinDefs.h
no producir estas macros.Es por eso que sería mejor agregar una definición
NOMINMAX
del proyecto.