L'erreur est que vous ne pouvez pas initialiser un static const char*
au sein de la classe. Vous ne pouvez y initialiser que des variables entières.
Vous devez déclarer la variable membre dans la classe, puis l'initialiser en dehors de la classe :
// fichier d'en-tête
class Foo {
static const char *SOMETHING;
// rest of class
};
// fichier cpp
static const char *Foo::SOMETHING = "sommething";
Si cela vous semble gênant, dites-vous que c'est parce que l'initialisation ne peut apparaître que dans une seule unité de traduction. Si elle se trouvait dans la définition de la classe, elle serait généralement incluse dans plusieurs fichiers. Les entiers constants sont un cas particulier (ce qui signifie que le message d'erreur n'est peut-être pas aussi clair qu'il pourrait l'être), et les compilateurs peuvent effectivement remplacer les utilisations de la variable par la valeur entière.
En revanche, un char*
La variable pointe vers un objet réel en mémoire, qui est nécessaire pour exister réellement, et c'est la définition (y compris l'initialisation) qui fait exister l'objet. La "règle de la définition unique" signifie que vous ne voulez donc pas la placer dans un en-tête, car toutes les unités de traduction incluant cet en-tête contiendraient alors la définition. Ils ne pourraient pas être liés ensemble, même si la chaîne de caractères contient les mêmes caractères dans les deux cas, car selon les règles actuelles du C++, vous avez défini deux objets différents avec le même nom, et ce n'est pas légal. Le fait qu'ils contiennent les mêmes caractères ne rend pas la chose légale.