0

Salut, j'ai un membre statique d'une classe que je veux basé sur un modèle défini pour un sous-groupe de classes qui sont templated-à-dire:Paramètre modèle pour une spécialisation de modèle?

template <typename T> 
class FooT 
{ 
private: 
static int ms_id; 
}; 

template <typename T> 
class Foo {}; 

template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10; 

Malheureusement cela jette l'erreur suivante sous gcc 4.1.1

D: \ X \ .h (98): erreur: argument template 1 est invalide

sur la ligne: template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10;

Qu'est-ce que je fais mal est le concept général a permis en premier lieu?

Répondre

3

Vous pouvez le faire en se spécialisant partiellement un "modèle initialiseur":

template <typename T> 
class FooT 
{ 
private: 
static int ms_id; 
}; 

template <typename T> 
class Foo {}; 

template <typename T> 
class GetValue { 
    static const int v = 0; 
}; 

template <typename T> 
class GetValue< Foo<T> > { 
    static const int v = 10; 
}; 

template<typename T> int FooT<T>::ms_id = GetValue<T>::v; 
2

Vous n'êtes certainement pas en mesure de placer la classe template comme augument dans une instanciation de modèle. Vous devez mettre une classe "concrète".

Par exemple, avec int:

template <> 
int FooT< template Foo<int> >::ms_id = 10; 

ou

template<> 
int FooT<MyClass>::ms_id = 10; 
+0

Oui qui fonctionne mais je devrais alors dupliquer ce code pour chaque type de F Foo. Ce serait beaucoup de code que le compilateur peut sûrement automatiser à travers des modèles ... – user176168

1
template <typename T> class Foo{}; 

struct MS_ID_TEN 
{ 
protected: 
    static int ms_id; 
} 
int MS_ID_TEN::ms_id = 10; 

template <typename T> struct MS_ID {} 
template <typename T> struct MS_ID< Foo<T> > : MS_ID_TEN {}; 

template <typename T> 
class FooT : public MS_ID<T> 
{ 
};