D'après ce que j'ai compris, le C++ permet de définir des membres constants statiques à l'intérieur d'une classe, à condition qu'il s'agisse d'un type d'entier.
Pourquoi, alors, le code suivant me donne-t-il une erreur d'édition de liens ?
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
L'erreur que j'obtiens est la suivante :
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Il est intéressant de noter que si je commente l'appel à std::min, le code se compile et se lie parfaitement (même si test::N est également référencé à la ligne précédente).
Une idée de ce qui se passe ?
Mon compilateur est gcc 4.4 sous Linux.
4 votes
Fonctionne parfaitement avec Visual Studio 2010.
4 votes
Cette erreur exacte est expliquée à l'adresse suivante gcc.gnu.org/wiki/
0 votes
Dans le cas particulier de
char
vous pouvez le définir comme suitconstexpr static const char &N = "n"[0];
. Notez que les&
. Je suppose que cela fonctionne parce que les chaînes littérales sont définies automatiquement. Je suis un peu inquiet à ce sujet cependant - cela pourrait se comporter étrangement dans un fichier d'en-tête parmi différentes unités de traduction, car la chaîne de caractères sera probablement à plusieurs adresses différentes.1 votes
Cette question montre à quel point la réponse du C++ à la question "n'utilisez pas les #defines pour les constantes" est encore pauvre.
1 votes
@JohannesOvermann À cet égard, je voudrais mentionner l'utilisation de l'inline pour les variables globales depuis C++17.
inline const int N = 10
qui, à ma connaissance, dispose toujours d'un stockage défini par l'éditeur de liens. Le mot-clé inline pourrait également être utilisé dans ce cas pour fournir une variable statique définition dans le test de définition de la classe.1 votes
Comment utiliser une variable statique const int dans une autre classe ?