Bonjour,
J'ai une classe template A qui contient un champ de données membre statique x. Y-a-t'il un moyen de s'assurer que A<T>:: x va être réellement instancié (ie. symbole créé dans le fichier objet), pour toute instantiation implicite de A. On garantit qu'un objet de type A<T> est créé.
Exemple :
Pour l'instant j'ai tenté le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 // a.hpp template<typename T> struct A { unsigned x; A(); }; template<typename T> unsigned A<T>::x; // a.tpp #include "a.hpp" template<typename T> inline A<T>::A() { // quelque chose ici pour forcer A<T>::x } // a.cpp #include "a.hpp" #include "a.tpp" A<int> objet; // b.cpp #include "a.hpp" // contrat : A<int> instancié quelque part int main() { std::cout << A<int>::x << std::endl; return 0; }
Il fonctionne (a.o continent bien A<int>:: x), pour une compilation avec "g++ -O0", mais le symbole disparaît dès que l'optimisation est activée ("g++ -O1" suffit)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 template<typename T> inline A<T>::A() { unsigned* u = &A::x; (void)u; // pas de warning }.
Avec-vous une quelconque idée ?
Cordialement,
Camille
Partager