Petite classe simple compile sous Visual mais pas g++. - C++ - Programmation
Marsh Posté le 08-10-2005 à 23:19:34
g++ à raison.
Quelle version de visual ?
Vecteur v10="{1,2,3}" appelle le constructeur de copie.
vu que Vecteur dispose d'un constructeur Vecteur(char*) non explicit, tu autorise alors une conversion implicite char* <-> Vecteur.
Il y a donc création d'un objet Vecteur temporaire Vecteur("{1,2,3}" ). Or, ton constructeur de copie est déclaré comme cela : Vecteur ( Vecteur& ) ,ce qui est catastrophique. Or il est illégal d'assigner un temporaire à une référence non const, la norme est claire la dessus il m semble.
Donc tu sais ce qu'il te reste à faire ...
Spoiler : mettre des const ! Utiliser la construction Vecteur v10("{1,2,3}" ) |
Marsh Posté le 09-10-2005 à 08:14:05
Merci beaucoup pour ton explication très pédagogue ++fab, c'est comme ça que l'on progresse. Il s'agit de la dernière version .NET beta 2.
Edit : Une petite précision s'il te plaît, qu'entends-tu par conversion non explicite ?
Quelle est la différence entre
vecteur v2("(1,2,3)" );
et vecteur v2="(1,2,3)";
(les deux semblent fonctionner depuis que j'ai ajouté le const au constructeur par copie)
Dans la première écriture, celle que tu m'as proposé, je comprends mieux ce qu'il se passe (passage par le constructeur de recopie). En fait, j'avais essayé de mettre un const, mais pour le char*.
Marsh Posté le 09-10-2005 à 10:15:14
HS : y a moins laid que
v1 = "(1,2,3)";
http://forum.hardware.fr/hardwaref [...] 0342-1.htm
Marsh Posté le 09-10-2005 à 23:11:01
Master_Jul a écrit : Quelle est la différence entre |
(1) appelle le constructeur Vecteur( char* ) directement.
(2) passe par le constructeur de copie comme expliqué ci dessus.
Citation : Edit : Une petite précision s'il te plaît, qu'entends-tu par conversion implicite ? |
le cas (2). Si tu avais déclaré ton constructeur comme ceci : explicit Vecteur( char* );
La création du temporaire Vecteur("{1,2,3}" ) ne se serait pas faite automatiquement à partir de "{1,2,3}".
Si tu fournis un constructeur pouvant prendre un paramètre, et non précédé du spécificateur explicit, alors tu autorises une conversion implicite du type du paramètre vers le type Vecteur.
Marsh Posté le 10-10-2005 à 00:15:40
Ok, merci beaucoup. Ca tombe bien, j'ai TP demain, cette aprem'. Je vais pouvoir expérimenter tout ça.
Marsh Posté le 10-10-2005 à 00:30:45
Master_Jul a écrit : Ok, merci beaucoup. Ca tombe bien, j'ai TP |
Alors tu vas probablement te rendre compte que ça ne fonctionne apparemment pas comme je te l'ai dis. Et pourtant, j'ai quand même raison ... pourquoi ?
Marsh Posté le 08-10-2005 à 22:36:07
Bonjour,
J'ai le classique problème des vecteurs qui me donne du fil à retordre car d'habitude je l'écris sous Visual C++ mais je dois maintenant le compiler avec g++ et ça ne donne pas le même résultat. Ca ne marche pas car les arguments ne sont pas vus du même type.
Extrait de l'implémentation :
Et l'erreur :
10 C:\vecteurv\main.cpp no matching function for call to `Vecteur::Vecteur(Vecteur)'
note C:\vecteurv\Vecteur.h:13 candidates are: Vecteur::Vecteur(char*)
note C:\vecteurv\Vecteur.h:13 Vecteur::Vecteur(Vecteur& )
Et ça marche parfaitement sous Visual. Bon certains diront que ce n'est pas une référence mais j'aimerais bien savoir comment faire fonctionne cela avec g++.
Merci !
Message édité par Master_Jul le 08-10-2005 à 22:44:11