2009-05-26 5 views
2

Comment faire une spécialisation de gabarit qui prend 2 paramètres par rapport à la normale 1? je construisais une classe de pointeur et maintenant je pensais à étendre à faire un tableau, mais si je tente quelque chose comme ceci:Même classe avec 2 ou 1 paramètre de gabarit

template<class T,int s> class pointer{}; 
template<class T> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

Il me donne une erreur. Modèle ... redéclaré avec 1 paramètre.

Je l'ai besoin spécialisé parce que pointer<mama,10> a la taille() et l'opérateur [] tandis que pointer<mama> n'a pas, il a operator-> et *.

Répondre

8

Vous pouvez faire un modèle général pour le cas du tableau:

template <class TElem, int size = 0> 
class pointer 
{ 
    // stuff to represent an array pointer 
}; 

Ensuite, une spécialisation partielle:

template <class TElem> 
class pointer<TElem, 0> 
{ 
    // completely different stuff for a non-array pointer 
}; 

En définissant une version spécialisée dans le cas où la taille = 0, vous pouvez réellement donner une implémentation totalement différente, mais avec le même nom. Cependant, il pourrait être plus clair de lui donner un nom différent.

2

Vous pouvez avoir une valeur par défaut pour le second paramètre, peut-être quelque chose comme ceci:

template <class T, int N=0> 
class moo { 
     T *foo; 
public: 
     moo() { 
       if (N > 0) { 
         foo = new T[N]; 
       } 
       else 
       { 
         foo = new T; 
       } 
     } 
}; 
+0

si d'autre est moche ... –

3

Vous avez la classe modèle redéclaration dans votre code qui conduira à une erreur de compilation. Vous pouvez avoir des arguments de modèle par défaut et des paramètres de modèle de modèle.

template<class T,int s=10> class pointer{}; 

class mama{}; 
int main(){ 
    pointer<mama> m; 
} 

je en ai besoin spécialisé, car le pointeur a une taille() et l'opérateur [] tandis que le pointeur ne est pas, il a operator-> et *.

Il semble que vous ayez besoin d'un design différent pour votre classe. Je ne suis pas sûr si la spécialisation de modèle est la voie à suivre. De l'apparence de votre problème, vous devriez vraiment penser à se spécialiser en fonction des traits.

Questions connexes