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
Pour moi, cette erreur semble normal, puisque j'essai de faire une conversion entre un Foo*& en un const Foo*&.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*&)
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
Merci d'avance.
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; }
Partager