surcharge fonction template
Bonjour,
Voilà je n'arrive pas à comprendre pourquoi le code suivant ne compile pas :
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 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;
} |
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.