Pregunta

Me gustaría para definir dentro de una clase una constante cuyo valor es la int máxima posible. Algo como esto:

class A
{
    ...
    static const int ERROR_VALUE = std::numeric_limits<int>::max();
    ...
}

Esta declaración falla al compilar con el mensaje siguiente:

  

numeric.cpp: 8: error: 'std :: numeric_limits :: Max ()' no pueden aparecer en una constante-expresión   numeric.cpp: 8: Error: una llamada de función no puede aparecer en una constante en la expresión

entiendo por qué esto no funciona, pero dos cosas se ven raro para mí:

  1. Me parece una decisión natural para utilizar el valor de expresiones constantes. ¿Por qué los diseñadores del lenguaje deciden hacer max () una función de lo que no permite este uso?

  2. Las reivindicaciones de especificaciones en 18.2.1 que

      

    Para todos los miembros declararon static const en la plantilla numeric_limits, especializaciones definirá estos valores de una manera tal que sean utilizables como expresiones constantes integrales.

    ¿No significa que yo debería ser capaz de utilizarlo en mi escenario y no contradice el mensaje de error?

Gracias.

¿Fue útil?

Solución

Mientras que la norma actual carece de apoyo aquí, para tipos integrales Boost.IntegerTraits le da el tiempo de compilación constantes const_min y const_max.

El problema surge a partir de §9.4.2 / 4 :

  

Si un miembro de datos estático es de integral const o tipo de enumeración const, su declaración en la definición de clase puede especificar una constante inicializador que deberá ser una expresión constante integral (5.19). En ese caso, el miembro puede aparecer en expresiones constantes integrales.

Tenga en cuenta que se agrega:

  

El miembro deberá todavía ser definido en un ámbito espacio de nombres si se utiliza en el programa y la definición del alcance de espacio de nombres no deberá contener un inicializador.

numeric_limits Como otros ya mencionados min() y max() simplemente no son expresiones constantes integrales, es decir, constantes de tiempo de compilación.

Otros consejos

se parece a un poco de un defecto ...

En C ++ 0x, numeric_limits tendrá todo marcado con constexpr, que significa que será capaz de utilizar min() y max() como constantes en tiempo de compilación.

¿Quieres:

#include <limits>

struct A {
static const int ERROR_VALUE;
}; 

const int A::ERROR_VALUE = std::numeric_limits<int>::max();

Ponga la clase / struct en una cabecera y la definición en un archivo .cpp.

No se contradice, porque max no se define static const. Es sólo una función miembro estática. Las funciones no pueden ser const, y funciones miembro estáticas no pueden tener un const unido en el extremo derecho tampoco.

También hay un double max() en la versión doble de los límites, y en C ++ 03 que no funcionaría decir static double const max = .... Así que para ser consistente, max() es una función para todas las versiones de la plantilla límite.

Ahora, se sabe que max() no ser capaz de ser utilizado de esa manera es malo, y C ++ 0x ya lo resuelve por lo que es una función constexpr, lo que permite su uso propuesto.

  • Voy a tratar de responder a todo lo que entendí de su pregunta:

1- Si quieres un const int estática en su programa que se inicia con una función:

int Data()
{
 return rand();
}

class A
{
public :
    static const int ee;
};
const int A::ee=Data();

Esto funciona en VS 2008

2- Si desea obtener el número máximo y mínimo para un determinado tipo de datos, a continuación, utilizar estas definiciones INT_MAX, INT_MIN, LONG_MAX y así sucesivamente ..

3- Sin embargo, si es necesario utilizar este tipo de plantilla WRT, a continuación, codificar las plantillas mismo

template<>
int MaxData()
{
 return INT_MAX;
}

y

template<>
long MaxData()
{
 return LONG_MAX ;
}

y llamarlos como esto

int y=MaxData<int>();

4 y si sólo se trata de tipos binarios representado solamente, a continuación, utilizar la siguiente:

template <class T>
T MaxData(){
    return ~(1<<((sizeof(T)*8)-1));
}

y esto

template <class T>
T MinData(){
    return (1<<((sizeof(T)*8)-1));
}

Espero que esto puede ayudar ..

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