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 :
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).
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
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() {}
    ;
 
};
Tout cela est plutot simple.
Sauf que si je fais le test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Ma ma1;
Mb mb1;
 
ma1==mb1
je me retrouve avec une erreur de compil :
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)
Il semblerait donc que la liaison dynamique ne marche pas en C++?

Encore plus étonnant :
Je fais un copier coller de la définiton de l'opérateur
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;
    };
de la classe M vers la classe Ma (qui défini donc ==(Ma) et ==(M)).
Et la ca passe...

J'avoue êrte un peu perdu...

Quelqu'un pour éclairer ma lanterne?
D'avance merci.