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 :

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;
}
Pour l'instant j'ai tenté le code suivant :

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
}
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) .

Avec-vous une quelconque idée ?

Cordialement,

Camille