Spécialisation partielle d'une méthode de classe
Bonjour,
J'ai une question pour les fans de templates, mais tout d'abord, voici le code qui illustrera la question :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream>
#include <string>
template<typename T1, typename T2>
class A
{
public:
void f();
template <typename T3> void g();
};
template< typename T1, typename T2 >
void A<T1, T2>::f()
{
g<T1>();
}
// spécialisation pour T1 = int
template< typename T1, typename T2 >
template<>
void A<T1, T2>::g<int>()
{
std::cout << 24 << std::endl;
}
int main()
{
A<int, std::string> a;
a.f();
return 0;
} |
J'ai donc une classe qui a deux paramètres templates. Dans cette classe, la méthode g() a un comportement spécifique en fonction du premier paramètre, indépendemment du second.
J'avais tout d'abord pensé à spécialiser partiellement la méthode avec un truc du genre ;
Code:
1 2
| template<typename T2>
void A<int, T2>::g() { ... } |
mais ce n'est pas autorisé. Alors j'ai écrit le code placé plus haut, en me disant que j'allais paramétrer la méthode g() pour ensuite la spécialiser ; mais là encore, le compilateur fait la tête :
Citation:
Envoyé par g++
test_template.cpp:20: erreur: invalid explicit specialization before ‘>’ token
test_template.cpp:20: erreur: fermetures de patrons de classe ne sont pas explicitement spécialisées
test_template.cpp:21: erreur: template-id ‘g<int>’ for ‘void A<T1, T2>::g()’ does not match any template declaration
test_template.cpp:21: erreur: déclaration de fonction invalide
Je crois comprendre qu'il ne veut pas que je spécialise une méthode d'une classe template si je ne spécialise pas la classe elle-même.
Alors maintenant je suis un peu à court d'idées, je m'en remet donc à vous. Avez-vous une idée pour m'aider à obtenir ce que je veux ?
Merci