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 de struct ifxHeapStatsFilters para comprobar si es el tema aquí
  • sí! tiene usted razón! funcionó! 🙂
InformationsquelleAutor mmostajab | 2014-12-12

2 Comentarios

  1. 84

    El problema es causado por la <Windows.h> archivo de encabezado que incluye las definiciones de macro denominada max y min:

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

    Ver a esta definición, el preprocesador sustituye a la max identificador de la expresión:

    std::numeric_limits<size_t>::max()

    por la definición de macro, llevando eventualmente a la sintaxis no válida:

    std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))

    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):

    #define NOMINMAX   

    o envoltura de la llamada a max con paréntesis, lo que impide la expansión de 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()
    • Se advierte: la definición de NOMINMAX podría causar nuevos problemas como la min/max macros son requerido/utilizado/espera por un montón de otras Ventanas encabezados…
  2. 8

    Como otras personas dicen que el problema es que en <WinDefs.h> (incluido por <windows.h>) se define macros min y max, pero si vas a ver la 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 */

    vas a ver que si no se define una macro NOMINMAX luego WinDefs.h no producir estas macros.

    Es por eso que sería mejor agregar una definición NOMINMAX del proyecto.

Dejar respuesta

Please enter your comment!
Please enter your name here