Bonjour,
Voilà je n'arrive pas à comprendre pourquoi le code suivant ne compile pas :
Lors que le compilateur instancie la méthode print avec T=std::vector<int> il utilise la fonction template adapter (1) alors que selon moi il devrait choisir la (2) qui est plus "spécialisée". Le plus étrange c'est que si je place la définition de (2) avant la définition de la classe B il n'y a plus d'erreur. J'ai beau chercher je n'arrive pas à trouver d'explications. Donc si quelqu'un pouvait éclairer ma lanterne je lui en serais reconnaissant.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45 #include <iostream> #include <vector> template<typename T> (1) void adapter(T const& t) { t.print(); } class A { public: void print() const { std::cout << "A" << std::endl; } }; template<typename T> class B { public: B(T const& t) : t_(t) { } void print() const { adapter(t_); } private: T const& t_; }; template<typename T> (2) void adapter(std::vector<T> const& v) { std::cout << v.size() << std::endl; } int main() { std::vector<int> v(20); A a; B<std::vector<int> > b1(v); B<A> b2(a); b1.print(); b2.print(); return 0; }
Partager