Je vais deviner que vous utilisez Visual C++, qui a une extension de langage plutôt horrible, comme décrit dans "Microsoft Extensions to C and C++":
Sur Définition Classe de const statique membres à part entière (ou ENUM)
Sous la norme (/Za
), vous devez définir une définition hors classe pour les membres de données. Par exemple,
class CMyClass {
static const int max = 5;
int m_array[max];
}
...
const int CMyClass::max; // out of class definition
Sous /Ze
, la définition hors classe est facultative pour les statiques, const intégrale et const membres de données ENUM. Seules les intégrales et les énumérations statiques et const peuvent avoir des initialiseurs dans une classe; l'expression d'initialisation doit être une expression const.
Pour éviter les erreurs lorsqu'une définition hors classe est fournie (lorsque la définition hors classe est fournie dans un fichier d'en-tête et que le fichier d'en-tête est inclus dans plusieurs fichiers source), vous devez utiliser selectany. Par exemple:
__declspec(selectany) const int CMyClass::max = 5;
Le drapeau /Ze
est activé par défaut. Vous devez utiliser explicitement le drapeau /Za
si vous ne voulez pas les extensions de langue.
Le code tel qu'il est écrit compile et lie tel quel sans erreur en utilisant g ++ 4.5.2, Clang 3.0 et Visual C++ 2010 avec l'ensemble d'indicateurs /Za
. Suppression de la définition du fichier .cpp résout le problème si vous souhaitez compiler avec Visual C++, mais cela ne fonctionnera pas avec les autres compilateurs (ou avec /Za
) si vous essayez d'utiliser le membre de données. Pour une solution portable, vous pouvez utiliser un bloc de compilation conditionnelle qui vérifie si les extensions sont activées:
#ifndef _MSC_EXTENSIONS
const int A::b;
#endif
Quel compilateur utilisez-vous? J'ai essayé ceci avec g ++ sur Ubuntu (ajouté un stub 'main()' de sorte que l'éditeur de liens s'exécute) et n'a reçu aucun avertissement du tout. – QuantumMechanic