Erreur de compilation sur default argument

Erreur de compilation sur default argument - C++ - Programmation

Marsh Posté le 10-10-2011 à 10:39:57    

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

Reply

Marsh Posté le 10-10-2011 à 10:39:57   

Reply

Marsh Posté le 10-10-2011 à 11:08:12    

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:".
 

Reply

Marsh Posté le 10-10-2011 à 11:19:01    

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 ?

Reply

Marsh Posté le 10-10-2011 à 13:04:39    

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é.
Reply

Marsh Posté le 10-10-2011 à 13:14:08    

Oui c'est bien ça.
Et

Code :
  1. int const& truc


Message édité par Morpho Menelaus le 10-10-2011 à 13:15:46
Reply

Marsh Posté le 11-10-2011 à 16:05:10    

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 ??

Reply

Marsh Posté le 11-10-2011 à 16:14:08    

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
Reply

Marsh Posté le 12-10-2011 à 10:07:16    

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

Reply

Marsh Posté le 12-10-2011 à 13:39:46    

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
Reply

Marsh Posté le 12-10-2011 à 23:08:25    

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é.
Reply

Marsh Posté le 12-10-2011 à 23:08:25   

Reply

Marsh Posté le 13-10-2011 à 10:38:14    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed