2009-09-12 9 views
20

Le code de spécialisation de modèle suivant:C++ spécialisation de modèle de fonction: "l'utilisation illégale des arguments de modèle explicite"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

Cas de test 1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

Cas de test 2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

génère l'erreur de compilation suivante:

error C2768: 'spec1' : illegal use of explicit template arguments

Est-ce que quelqu'un sait pourquoi?

+0

Quelle plate-forme/compilateur utilisez-vous? – aaa90210

+0

J'utilise Visual C++ 08 – jameszhao00

Répondre

51

modèles de fonction ne peuvent pas être partiellement spécialisée, seule entièrement, à savoir comme ça:

template<> 
void spec1<char, int>() 
{ 

} 

Pour pourquoi les modèles de fonction ne peuvent pas être partiellement spécialisée, vous voudrez peut-être read this.

Lorsque vous vous spécialisez en partie (uniquement pour les classes), vous auriez à le faire comme ça:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

donc vous devez à la liste T1 à nouveau.

La façon dont vos spécialisations sont écrites, elles seraient ambiguës pour spec1<int, int>.

+3

Ah donc je peux avoir des classes partiellement spécialisées intégrées avec des fonctions statiques? – jameszhao00

+0

Oh, je vois que l'article que vous liez explique déjà des choses. J'ai enlevé ma réponse, puisque j'ai trouvé que la transmission à une classe est plus commode pour ce cas. Dans les cas où 'T1' et' T2' sont utilisés comme types de paramètres de fonction, je trouve que la surcharge est beaucoup plus lisible, puisqu'elle est juste comme une surcharge de fonction normale. –

+0

Quand j'ai lu "seulement possible pour les classes", j'ai hésité. J'ai trouvé que c'est possible pour les classes et les structures ;-). –

Questions connexes