Evidemment, il y a toujours une hypothèse qui attire plus l'attention qu'une autre, entre autres, parce qu'elle requière des explications plus longues. Je n'y peux pas grand chose si tu as choisi de te braquer à chaque fois sur ces explications là alors que, comme tu le dis, c'est hors de propos.
Je vais donc m'efforcer d'être clair:
Oui, il est tout à fait valide de définir une variable statique d'une classe template dans un .cpp ou dans un tpp.
Seulement, si tu le fais, tu n'as qu'une seule garantie quant à l'initialisation de cette variable : en dehors du .cpp dans lequel la valeur est définie ou de tout cpp qui inclut aussi le tpp, tu n'as aucune
garantie que la variable aura bel et bien été initialisée.
C'est à dire que si tu découpes ton code sous une forme proche de
a.hpp
Code:
1 2 3 4 5
| template <typename T>
struct A
{
static const int x
}; |
a.tpp
Code:
1 2
| template <typename T>
const int A<T>::x = /* une valeur quelconque */ ; |
truc.cpp
Code:
1 2 3 4 5 6 7
| #include a.hpp
#include a.tpp
void foo()
{
A<Machin> mavar;
/* ... */
} |
bidule.cpp
Code:
1 2 3 4 5 6 7 8
|
#include <a.hpp>
// !!! attention !!! pas d'inclusion de a.tpp
void bar()
{
A<Machin> mavar;
/* ... */
} |
tu te trouves face au problème que A<Machin>:: x n'est défini
que pour l'unité de compilation qui nous permet d'avoir truc.o
Si tu essayes d'accéder à cette valeur depuis ta fonction bar, tu auras peut etre de la chance... ou pas...
Avec un peu de chance, selon l'ordre dans lequel l'éditeur de liens aura travaillé, A<Machin>:: x aura été défini, et tu pourra l'utiliser
Avec un peu moins de chance, ce ne sera pas le cas, et tu te retrouveras avec des résultats aberrants.
C'est la raison pour laquelle je te conseillerais plutot de passer par une énumération, car tu sera sur que cette constante de compilation est correctement définie ;)