Bonjour,

J'ai un petit souci avec un code C++, une petite question d'héritage avec utilisation de template à la base, mais qui me fait soulever une autre question.

Le code source est en pièce jointe.

Voici la situation. Ce code fourni 2 implémentations qui sont, a priori, identiques du point de vue fonctionnelle, une utilisant des templates, et l'autre non. On peut passer de l'une à l'autre en commentant la définition #define WITH_TEMPLATE.

Le 1er problème que je rencontre est que ces deux implémentations, a priori identique, ne se comporte pas de la même manière à la compilation : l'une passe (cell utilisant les templates), et l'autre provoque l'erreur suivante
test.cxx: Dans function « int main(int, char**) »:
test.cxx:53: error: no matching function for call to `Base::method(Foo*&)'
test.cxx:24: error: candidates are: virtual bool Base::method(const Foo*&)
Pour moi, cette erreur semble normal, puisque j'essai de faire une conversion entre un Foo*& en un const Foo*&.

2ème problème, mais qui sans doute lié au premier, est que la version avec template, qui compile correctement, s'exécute... sans polymorphisme ! Alors qu'il devrait. Et affiche donc "Base: method" au lieu de "Child: method".

Ne voyant pas le problème, j'appelle à l'aide. Si certains d'entre vous ont des idées là-dessus.

Dernière chose, j'ai testé les compilateurs g++-3.3.6, g++-4.3.2 ainsi que le compilateur Comeau en ligne, et tous donne les même résultats à la compilation, donc je pense que l'on peut écarter un bug du compilo...

Mon code
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
46
47
48
49
50
51
52
53
54
55
56
//#define WITH_TEMPLATE
 
#include <iostream>
 
using namespace std;
 
class Foo
{
 
};
 
#define OBJECT Foo*
 
 
#ifdef WITH_TEMPLATE
template<class T_Object>
#else
#define T_Object OBJECT
#endif
class Base
{
	public:
	virtual bool method(const T_Object& obj)
	{
		cout << "Base: method" << endl;
	}
};
 
#ifdef WITH_TEMPLATE
class Child : public Base<OBJECT>
#else
class Child : public Base
#endif
{
	public:
	bool method(const OBJECT& obj)
	{
		cout << "Child: method" << endl;
	}
};
 
int main(int argc, char** argv)
{
#ifdef WITH_TEMPLATE
	Base<OBJECT> *b;
#else
	Base *b;
#endif
	OBJECT f;
	Child c;
 
	b = &c;
	b->method(f);
 
	return 0;
}
Merci d'avance.