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 : 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
#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.