2010-10-29 39 views
0

J'ai trouvé que la méthode du template pouvait être surchargée, est-ce que je peux faire la même chose sur les classes template? Si 2 classes de modèle correspondent à une instanciation de classe de modèle, nous pouvons utiliser le type de paramètre dans le constructeur pour en déduire lequel utiliser.Est-il possible de surcharger une classe de modèle?

template <typename T> 
class A{ 
    A(T){} 
}; 

template <typename T> 
class A{ 
    A(T*){} 
}; 

int main(){ 
    A<int*> a((int*)0); 
    A<int> a((int*)0); 
    return 0; 
} 
+2

Juste pour que vous le sachiez: la syntaxe backtick est pour le code en ligne. Lorsque vous souhaitez formater des blocs de code, indentez chaque ligne de quatre espaces. http://daringfireball.net/projects/markdown/ –

+0

classes de modèles peuvent être spécialisés (partiellement ou complètement) – Anycorn

+0

@Jonathan Sterling, merci pour votre indice. comment puis-je indenter un code de bloc pour 4 espaces? Il semble que l'onglet sur l'ensemble du bloc ne fonctionne pas. Y a-t-il un raccourci pour le faire? Ou dois-je insérer des espaces ligne par ligne? – Thomson

Répondre

5

Non. Ceci n'est pas autorisé. Au lieu de cela, le modèle de classe peut être spécialisé (y compris la spécialisation partielle). Ceci réalise à peu près l'effet de la surcharge (qui est seulement pour les fonctions)

Notez que les paramètres de modèle ne peuvent pas être déduits des arguments constructeur.

template<class T> struct X{ 
    void f(){} 
}; 

template<class T> struct X<T*>{ 
    void f(){} 
}; 

int main(){ 
    X<int> x; 
    x.f();   // calls X<T>::f 

    X<int *> xs; 
    xs.f();   // calls X<T*>::f 
}