Je crois comprendre que C ++ permet aux membres const statiques d'être définis à l'intérieur d'une classe tant qu'il s'agit d'un type entier.
Pourquoi, alors, le code suivant me donne-t-il une erreur de l'éditeur 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:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
Fait intéressant, si je commente l'appel à std :: min, le code se compile et se lie très bien (même si test :: N est également référencé sur la ligne précédente).
Une idée de ce qui se passe?
Mon compilateur est gcc 4.4 sous Linux.
char
, vous pouvez le définir à la place comme constexpr static const char &N = "n"[0];
. Notez le &
. Je suppose que cela fonctionne parce que les chaînes littérales sont définies automatiquement. Je suis un peu inquiet à ce sujet cependant - il pourrait se comporter étrangement dans un fichier d'en-tête parmi différentes unités de traduction, car la chaîne sera probablement à plusieurs adresses différentes.
inline const int N = 10
, qui à ma connaissance a encore un stockage quelque part défini par l'éditeur de liens. Le mot clé en ligne pourrait également être utilisé dans ce cas pour fournir une définition de variable statique dans le test de définition de classe.