Hello
J'ai actuellement un soucis avec gcc. Je suis pas un pro C++, je viens plutot du monde JAVA, alors pardonnez moi si je divague.
Bref, je m'explique.
J'ai 1 classe mère, mettons M, et deux classes qui héritent en public de M, mettons Ma et Mb.
M défini un operateur == avec en paramètre M.
Je voudrais pouvoir surcharger cet opérateur dans Ma, de tel façon que si le second oprande est de type Ma on utilise l'opérateur == de Ma, et celui de M sinon.
En gros pour résumer :
La défnition des classes ci dessus expliquée serait la suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 M m1; Ma ma1,ma2; Mb mb1; ma1 == ma2; // utilise l'opérateur Ma::operator== ma1 == m1; // utilise l'opérateur M::operator== ma1 == mb1; // utilise l'opérateur M::operator== (car Mb est un sous type de M).
Tout cela est plutot simple.
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 class M { public: M() {} ; virtual ~M(){}; virtual bool operator==(M m) { std::cout <<" M::operator=="<<std::endl; return true; }; }; class Ma : public M{ public: Ma() {} ; virtual ~Ma(){}; virtual bool operator==(Ma m) { std::cout <<" Ma::operator=="<<std::endl; return true; }; }; class Mb : public M{ public: Mb() {} ; };
Sauf que si je fais le test :
je me retrouve avec une erreur de compil :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Ma ma1; Mb mb1; ma1==mb1
Il semblerait donc que la liaison dynamique ne marche pas en C++?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 src/test/testMisc.cpp:101: error: no match for 'operator==' in 'ma1 == mb1' src/test/testMisc.cpp:40: note: candidates are: virtual bool Ma::operator==(Ma)
Encore plus étonnant :
Je fais un copier coller de la définiton de l'opérateur
de la classe M vers la classe Ma (qui défini donc ==(Ma) et ==(M)).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 virtual bool operator==(M m) { std::cout <<" M::operator=="<<std::endl; return true; };
Et la ca passe...
J'avoue êrte un peu perdu...
Quelqu'un pour éclairer ma lanterne?
D'avance merci.
Partager