Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1821 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Erreur de compilation sur default argument

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de compilation sur default argument

n°2105513
in_your_ph​ion
Posté le 10-10-2011 à 10:39:57  profilanswer
 

Bonjour,
 
Pourquoi ceci ne compile pas :
 

Code :
  1. #include <iostream>
  2. void toto( std::string & a = std::string() );
  3. int main() { return 0; }


 
et retourne l'erreur suivante :
 

Citation :

error: default argument for 'std::string& a' has type 'std::string'


 
En revanche, ceci marche (avec const) :
 

Code :
  1. #include <iostream>
  2. void toto( const std::string & a = std::string() );
  3. int main() { return 0; }


 
 :??:  
 
Merci par avance

mood
Publicité
Posté le 10-10-2011 à 10:39:57  profilanswer
 

n°2105526
olivthill
Posté le 10-10-2011 à 11:08:12  profilanswer
 

Problème classique de namespace dû à une évolution du standard d'il y a quelques années.
 
En pratique, il suffit d'ajouter

using namespace std;

pour ne pas avoir d'ennui avec ces "std:".
 

n°2105531
in_your_ph​ion
Posté le 10-10-2011 à 11:19:01  profilanswer
 

olivthill a écrit :

Problème classique de namespace dû à une évolution du standard d'il y a quelques années.
 
En pratique, il suffit d'ajouter

using namespace std;

pour ne pas avoir d'ennui avec ces "std:".
 


 
 :ouch:  
 
Merci, mais pourquoi est ce que cela marche avec le const ?

n°2105554
Mara's dad
Yes I can !
Posté le 10-10-2011 à 13:04:39  profilanswer
 

Parce-que tu déclare ta variable comme optionnelle.
 
Comme en plus tu prend une référence sur la variable, elle doit obligatoirement être const pour éviter que ta fonction modifie sa valeur.
 
 

Code :
  1. void toto( int &i )
  2. {
  3.   ... // Code
  4. }
  5. int main()
  6. {
  7.   toto( 3 );  // <-- interdit
  8.   return 0;
  9. }


 
mais  
 

Code :
  1. void toto( const int &i )
  2. {
  3.   ... // Code
  4. }
  5. int main()
  6. {
  7.   toto( 3 );  // <-- OK
  8.   return 0;
  9. }


 
Dans ce cas, la variable i de toto est "créée" automatiquement.
 
C'est pareil dans ton cas.
 
void toto( int &i  = 0); // NON
void toto( const int &i =  0 ); // OUI
void toto( int i  = 0); // OUI
void toto( const int i =  0 ); // OUI
 

Citation :

Un autre avantage des références constantes pour les passages par variables est que si le paramètre n'est pas une variable ou, s'il n'est pas du bon type, une variable locale du type du paramètre est créée et initialisée avec la valeur du paramètre transtypé.


Enfin il me semble, si j'ai bien compris : http://fr.wikibooks.org/wiki/Progr [...] C3.A9rence

Message cité 1 fois
Message édité par Mara's dad le 10-10-2011 à 13:09:42

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°2105555
Morpho Men​elaus
Posté le 10-10-2011 à 13:14:08  profilanswer
 

Oui c'est bien ça.
Et

Code :
  1. int const& truc


Message édité par Morpho Menelaus le 10-10-2011 à 13:15:46
n°2105798
in_your_ph​ion
Posté le 11-10-2011 à 16:05:10  profilanswer
 

Mara's dad a écrit :


Citation :

Un autre avantage des références constantes pour les passages par variables est que si le paramètre n'est pas une variable ou, s'il n'est pas du bon type, une variable locale du type du paramètre est créée et initialisée avec la valeur du paramètre transtypé.




 
 :ouch:  :ouch:  
 
qu'entends tu par transtypé ? est ce que ce la veut dire qu'on va copier tout l'objet (de mauvais type) dans une variable locale, de manière cachée ?
 
c'est pas top ça non ??

n°2105801
theshockwa​ve
I work at a firm named Koslow
Posté le 11-10-2011 à 16:14:08  profilanswer
 

in_your_phion a écrit :


 
 :ouch:  :ouch:  
 
qu'entends tu par transtypé ? est ce que ce la veut dire qu'on va copier tout l'objet (de mauvais type) dans une variable locale, de manière cachée ?
 
c'est pas top ça non ??


 
 
Ca ne se fait pas magiquement, y'a pas d'inquiétude à avoir. Tout objet ne peut pas se trnastyper, la plupart du temps, tu auras une erreur de compilation.
 
Pour te rassurer, tu devrais peut-être aussi regarder le mot clé explicit et son utilisation.


---------------
last.fm
n°2105897
in_your_ph​ion
Posté le 12-10-2011 à 10:07:16  profilanswer
 

theshockwave a écrit :

Tout objet ne peut pas se trnastyper


 
salut
merci ,donc si j'ai bien compris, on a :
 
a)

Code :
  1. void toto( std::string & s = std::string() );


 
=> ça ne marche pas, mais je ne ne comprend pas vraiment pourquoi car les objets sont de même type ? apparement un 'bug' du C++
 
b)

Code :
  1. void toto(const std::string & s = std::string() );


 
marche et crée un objet temporaire de type std::string si on ne passe pas d'argument à la fonction toto(). Par contre je ne comprend pas bien pourquoi le 'const' fait en sorte que ça fonctionne
 
et c)

Code :
  1. void toto(const std::string & s = "salut" );


...marcherait avec un gogo gadgeto transtypage  ... qui met 'salut' dans une std::string ?
 
c'est ça ?
 
merci

n°2105963
theshockwa​ve
I work at a firm named Koslow
Posté le 12-10-2011 à 13:39:46  profilanswer
 

a) tu demandes une références sur un temporaire => c'est illégal et c'est normal, parce que dès que l'initialisation de ta référence est faite, le temporaire est détruit. Ca n'a pas de sens.
 
b) tu demandes une référence constante sur un temporaire et là, le langage est clair et fait une exception exactement sur ce type de cas de figure : une référence const sur un temporaire accroît la durée de vie du temporaire à celle de la référence const (ici, donc, l'intégralité de ta fonction)
 
c) std::string a un constructeur qui peut prendre une chaine de type C, donc la construction d'un argument du type attendu par la fonction est possible, c'est donc ce qui est fait.
Se le constructeur en question avait été noté comme "explicit" alors cette déclaration aurait fait une erreur de compilation (mauvais type d'argument)


---------------
last.fm
n°2106078
Mara's dad
Yes I can !
Posté le 12-10-2011 à 23:08:25  profilanswer
 

in_your_phion a écrit :

=> ça ne marche pas, mais je ne ne comprend pas vraiment pourquoi car les objets sont de même type ? apparement un 'bug' du C++


 
Heu là t'y vas un peu fort quand même.
 
Je veux bien que le C/C++ ne soit pas simple à comprendre pour ce qui est des varibles, pointeurs et références, mais tout ceci est TRES logique et tient très bien la route.
 
C'est pas un truc pondu par un Gus qu'avait 5 minutes à perdre.
Y'a du jus de cerveau la dedans. Et pas qu'un peu !
 
Un des ajout du C++ part rapport à C c'est justement de pouvoir déclarer des références en tant que paramètre de fonction.
En C on était obligé de se trimbaler des pointeurs ce qui finissait par devenir lourd.
 
Je ne dis pas qu'il ne peut pas y avoir de bugs dans un compilateur C/C++ :)  
En revanche, pour en trouver un dans la définition du language, faudra se lever plus tôt...
 
A+


Message édité par Mara's dad le 12-10-2011 à 23:10:57

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
mood
Publicité
Posté le 12-10-2011 à 23:08:25  profilanswer
 

n°2106140
in_your_ph​ion
Posté le 13-10-2011 à 10:38:14  profilanswer
 

salut
ok merci pour vos réponses, c'est très clair à présent ! :=)

 

en fait, je crois que j'avais été un peu confus par la réponse de olivthill, mais c'est peut être ma question qui n'était pas claire

 

thanks !


Message édité par in_your_phion le 13-10-2011 à 10:38:22

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Erreur de compilation sur default argument

 

Sujets relatifs
JS non compatible IE, erreur incompréhensible..test d'un document ou modification du niveau de gestion d'erreur
Erreur sur pointeur sur intErreur *** glibc detected ***free(): invalid pointeur
Compilation fortran sous cygwin : .exe demande UACAide pour compilation Webpart Sharepoint 2010
Erreur "build.xml:265 servletapi not found"Ajax et session PHP erreur Incomplete Object
Erreur de script sur validateur html/xmlscript lua erreur "unexpected symbol near "
Plus de sujets relatifs à : Erreur de compilation sur default argument


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR