75 votes

Pourquoi les flotteurs de const statique ne sont-ils pas autorisés?

J'ai une classe qui contient essentiellement un ensemble de définitions constantes utilisées dans mon application. Pour une raison quelconque, long s sont compilés mais float s ne:

 class MY_CONSTS
{
public :
    static const long   LONG_CONST = 1;      // Compiles 
    static const float FLOAT_CONST = 0.001f; // C2864
};
 

Donne l'erreur suivante:

 1>c:\projects\myproject\Constant_definitions.h(71) : error C2864: 'MY_CONSTS::FLOAT_CONST' : only static const integral data members can be initialized within a class
 

Est-ce que je manque quelque chose?

63voto

Tyler McHenry Points 35551

Pour répondre à la question qui vous a demandé: "parce que la norme dit".

Seules les variables statiques, constant, partie intégrante types (y compris les énumérations) peut être initialisé à l'intérieur d'une déclaration de classe. Si un compilateur prend en charge dans la ligne de l'initialisation de la flotte, il est une extension. Comme d'autres l'ont souligné, la façon de traiter avec statique, constante, non intégrale des variables est de définir et de les initialiser dans le fichier source correspondant (pas la tête).

C++ Standard Section 9.2 "Membres du groupe" article 4:

Un membre de demande de déclaration peut contenir un constante d'initialiseur que si elle déclare un membre statique (9.4) de const intégrale ou const énumération type, voir 9.4.2.

Section 9.4.2 "Données Membres Statiques" article 2:

Si une donnée membre statique est de const intégrale ou const type d'énumération, sa déclaration dans la définition de classe pouvez spécifier une constante de l'initialiseur qui doit être une partie intégrante de la constante l'expression de (5.19). Dans ce cas, l' membre peuvent apparaître dans intégrale constante les expressions. Le membre doit toujours être défini dans un espace de noms portée si elle est utilisées dans le programme et l'espace de noms la définition de la portée ne doit pas contenir un initialiseur.

40voto

Will Points 30630

Vous devriez les initialiser dans le corps de l’un de vos fichiers cpp:

 class MY_CONSTS
{
public :
    static const long   LONG_CONST = 1;      // Compiles 
    static const float FLOAT_CONST;
};

const float MY_CONSTS::FLOAT_CONST = 0.001f;
 

19voto

JRL Points 36674

Voir de Stroustrup explication. Citation:

Une classe est généralement déclaré dans un fichier d'en-tête et un fichier d'en-tête est généralement inclus dans de nombreux les unités de traduction. Toutefois, afin d'éviter compliqué linker règles, C++ nécessite que chaque objet est unique définition. Cette règle serait cassé si C++ admis dans la définition de la classe de les entités qui doivent être stockés dans la mémoire des objets. Voir D&E pour une explication de C++de la conception des compromis.

9voto

AProgrammer Points 31212

La justification en vertu de la norme libellé que d'autres ont donné est le même pour qui arguments de modèle ne peut pas être nombre à virgule flottante. Pour obtenir de résultat cohérent, vous aurez besoin du compilateur de mettre en œuvre la même évaluation que l'on fait au moment de la compilation, et qui peut être compliqué pour le cross-compilateur et, dans le cas où le programme joue avec mode d'arrondi.

À partir de la mémoire en C++0X, la notion de constante d'expression a été prolongée, et de sorte que votre code sera valide (mais il n'est pas précisé dans le résultat de la virgule flottante expressions constantes sont les mêmes lorsqu'elles sont évaluées au moment de l'exécution ou au moment de la compilation).

3voto

Adrien Plisson Points 9750

qu'en est-il de:

 class MY_CONSTS
{
public :
    static const long   LONG_CONST;
    static const float FLOAT_CONST;
};

const long MY_CONSTS::LONG_CONST = 1;
const float MY_CONSTS::FLOAT_CONST = 0.001f;
 

(Cependant, je ne peux donner aucune explication de ce cas particulier ...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X