OVH Cloud OVH Cloud

Template et donnée membre statique

2 réponses
Avatar
adebaene
Bonjour =E0 tous,

Je me heurte =E0 un petit probl=E8me comment d=E9clarer une variable
statique dans une classe template quand le type de cette variable est
d=E9pendant?

Exemple

template <class T> class CoolStuff
{
typedef typename T::CriticalSectionType CriticalSectionType;
static CriticalSectionType MyCS;
};

myCS est utilis=E9 =E0 diff=E9rents endroits dans CoolStuff. Rien que du
tr=E8s classique...
Ce code compile bien, mais ne linke pas car la d=E9finition de MyCS
n'est trouv=E9e (elle devrait =EAtre dans un fichier source unique, mais
comme nous sommes en template...). Quelqu'un a une id=E9e pour
contourner le probl=E8me?

Merci.

Arnaud

2 réponses

Avatar
Anthony Fleury
Bonjour à tous,


Bonjour,

[...]

template <class T> class CoolStuff
{
typedef typename T::CriticalSectionType CriticalSectionType;
static CriticalSectionType MyCS;
};

Ce code compile bien, mais ne linke pas car la définition de MyCS
n'est trouvée (elle devrait être dans un fichier source unique, mais
comme nous sommes en template...). Quelqu'un a une idée pour
contourner le problème?


Non justement, en template elle est présente avec la définition de la
classe, donc dans le .h par exemple, ou dans un fichier inclut dans le
fichier de définition de la classe. (§14.5.1.3)

Un exemple :
-------------- test.h ---------------------------------------

class Exemple
{
public :
struct Interne {
Interne(int Premier, int Second):Premier(Premier),
Second(Second) {}
int Premier;
int Second;
};
};
template < class T > class ExempleTemplate
{
public:
static typename T::Interne B;
};

template <class T> typename T::Interne ExempleTemplate<T>::B(0, 0);


--------------------------------------------------------------------

----------------test1.cpp-------------------------------------------
#include "test.h"
#include <iostream>

void AutreUtilisation();

int main() {
ExempleTemplate< Exemple > Var;
std::cout << Var.B.Premier << " " << Var.B.Second << std::endl;
AutreUtilisation();
std::cout << Var.B.Premier << " " << Var.B.Second << std::endl;
}

---------------------------------------------------------------------

---------------------------test2.cpp---------------------------------
#include "test.h"

void AutreUtilisation() {
ExempleTemplate< Exemple > Variable;
Variable.B.Premier = 42;
Variable.B.Second = 53;
}

---------------------------------------------------------------------

Avatar
Arnaud Debaene
Anthony Fleury wrote:
Non justement, en template elle est présente avec la définition de la
classe, donc dans le .h par exemple, ou dans un fichier inclut dans le
fichier de définition de la classe. (§14.5.1.3)


Merci!

Arnaud