Bonjour,

J'ai une question pour les fans de templates, mais tout d'abord, voici le code qui illustrera la question :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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