Templates, polymorphisme : sujet trop long pour ce titre
Bonjour,
Le sujet complet est :
Un type paramètre d'une classe mère template doit-il matcher les besoins de la classe mère dans des méthodes qui sont redéfinies dans la classe fille ?
Ce n'est peut-être pas plus clair, mais des détails suivent.
J'ai un problème avec le code suivant :
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
| #include <iostream>
struct S
{
int a;
};
template <class T>
class A
{
public:
// on appelle f() de la classe instanciée
void g( const T& t ) { f(t); }
protected:
virtual void f( const T& t ) { std::cout << t << std::endl; }
};
class B : public A<S>
{
protected:
virtual void f( const S& t ) { std::cout << t.a << std::endl; }
};
int main()
{
S s;
s.a = 24;
B b;
b.g(s);
return 0;
} |
Le problème est que ça ne veut pas compiler :
Citation:
Envoyé par g++
test_template_virtual.cpp: In member function `void A<T>::f(const T&) [with T = S]':
test_template_virtual.cpp:12: instantiated from `void A<T>::g(const T&) [with T = S]'
test_template_virtual.cpp:29: instantiated from here
test_template_virtual.cpp:15: erreur: no match pour « operator<< » dans « std::cout << t »
Si je comprends bien, g++ voudrait que operator<<() soit défini pour S sous prétexte que ça serait utilisé dans A::f(). Sauf que moi, ce que je vois, c'est que A::f() n'est jamais appelée, et que la version B::f() est appelée à la place. Ou alors il y a quelque chose que je n'ai pas vu. Alors qui a les plus mauvais yeux, g++ ou moi ?
La version de g++ que j'utilise est la 3.4.4
Merci pour votre aide.