Bonjour,

J'ai développé une classe de chaine dynamique assez complète, il y a des années. La compilation et l'utilisation se passaient très bien jusqu'à ce que je mette à jour mon compilateur (g++). Je ne me suis pas mis à la page, mais le changement des normes C++ me fait aujourd'hui un résultat que je ne comprends pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Dynachar d("bonjour");
 
d=d+" Monsieur";
 
cout<<d<<endl;
Là, ça marche très bien, ça m'affiche "bonjour Monsieur".

Mais si je fais cela (en inversant le sens) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
Dynachar d("bonjour");
 
d=d+" Monsieur";
 
d="Ah, " + d;
 
cout<<d<<endl;
Ca ne compile pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
test.C: In function 'int main(int, char**)':
test.C:20: error: ambiguous overload for 'operator+' in '"Ah, " + d'
../lib/Dynachar.h:1488: note: candidates are: Dynachar operator+(const char*, Dynachar&)
../lib/Dynachar.h:1501: note:                 Dynachar operator+(const char*, Dynachar)
Voici mes prototypes liés à l'exemple ci-dessus :

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
Dynachar operator + (Dynachar &);                            //ajoute 2 Dynachar (et retourne 1 Dynachar)
 
   Dynachar operator + (Dynachar);                              //ajoute 2 Dynachar (et retourne 1 Dynachar)
 
   Dynachar operator + (const char *);                          //idem mais entre 1 Dynachar et 1 chaine
 
   friend ostream &operator <<(ostream&,const Dynachar&);       //permet de faire un << avec un Dynachar
 
   friend istream &operator >>(istream&,Dynachar&);             //permet de faire un >> avec un Dynachar
 
};
 
   Dynachar operator + (const char *,Dynachar &);               //fonction ext. à la classe. Ret. 1 Dynachar
 
   Dynachar operator + (const char *,Dynachar);                 //fonction ext. à la classe. Ret. 1 Dynachar
J'ai vu des solutions approchantes qui consistait à forcer un cast, mais je ne suis pas parvenu à les mettre en oeuvre.

Merci de votre aide !

Jérôme.