Pregunta

Esta línea funciona correctamente en un programa de prueba pequeño, pero en el programa para el que lo quiero, recibo las siguientes quejas del compilador:

#include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'

Obtengo los mismos resultados con:

#include <limits>
using namespace std;

x = numeric_limits<int>::max();

¿Por qué se ve a Max como el macro max (a, b)? ?

¿Fue útil?

Solución

Esto ocurre comúnmente al incluir un encabezado de Windows que define un min o max macro. Si está utilizando los encabezados de Windows, ponga #define NOMINMAX en su código, o construir con el interruptor de compilador equivalente (es decir, usar /Dnominmax para Visual Studio).

Tenga en cuenta que el edificio con NOMINMAX Desactiva el uso de la macro en todo su programa. Si necesita usar el min o max operaciones, usar std::min() o std::max() desde el <algorithm> encabezamiento.

Otros consejos

Otra solución sería envolver el nombre de la función con un paréntesis como este: (std::numeric_limits<int>::max)(). Lo mismo se aplica a std::max.

No estoy seguro de que sea una buena solución para esto ... Nominmax es mejor en mi opinión, pero esta podría ser una opción en algunos casos.

Algún otro archivo de encabezado está contaminando el espacio de nombres global con una macro MAX. Puedes arreglar eso sin defender la macro:

#undef max
x = std::numeric_limits<int>::max();
#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif

#include <limits>

//... your stuff that uses limits

#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif

Su definición para mí en Visual Studio 2013 (formateada para un mejor espacio ...) es la siguiente:

static _Ty (max)() _THROW0()
{   // return maximum value
    return (FLT_MAX);
}

Así que solo estoy usando flt_max. :) Esta puede no ser una solución universal, pero funciona bien en mi caso, así que pensé que compartiría.

(std :: numeric_limits :: max) ()

Muy fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top