Bonjour,
Voici ce qui me titille aujourd hui.
Dans une classe j'ai deux methodes de meme nom :
void fonction(string A, string B)
et
void fonction(string A, bool B)
quand j'appelle
monobjet.fonction("foo", "blah");
il appelle la deuxieme !
alors qu'avec
monobjet.fonction("foo", string("blah"));
il appelle la premiere.
Qu'il faille specifier string("blah") pour obtenir un objet string
d'accord, puisque "unechaine" est en fait un const char* si je ne
m'abuse.
Mais alors pourquoi appelle t-il la premiere fonction sans broncher ?
Un const char* peut etre assimile a un bool ?
Ca me parait etrange tout de meme. Et a vous ?
Merci de combler mon ignorance.
Vincent
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Falk Tannhäuser
"v.p." wrote:
Dans une classe j'ai deux methodes de meme nom : void fonction(string A, string B) et void fonction(string A, bool B)
quand j'appelle
monobjet.fonction("foo", "blah");
il appelle la deuxieme ! alors qu'avec
monobjet.fonction("foo", string("blah"));
il appelle la premiere.
Qu'il faille specifier string("blah") pour obtenir un objet string d'accord, puisque "unechaine" est en fait un const char* si je ne m'abuse. Mais alors pourquoi appelle t-il la premiere fonction sans broncher ? Un const char* peut etre assimile a un bool ?
Oui, les pointeurs peuvent être implicitement convertis vers 'bool', un pointeur null étant converti en 'false' et un autre pointeur valide en 'true' - tout cela pour maintenir la compatibilité avec le C, voir le C++ pré-standard, où on écrivait souvent "if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard" est considérée comme meilleure que la conversion "définie par l'utilisateur" à l'aide du constructeur std::string(char const*) (cf. § 13.3.3.2/2 du Standard)
La solution serait d'ajouter quelque chose comme void fonction(string A, char const* B) { fonction(A, std::string(B)); } das ta classe.
Falk
"v.p." wrote:
Dans une classe j'ai deux methodes de meme nom :
void fonction(string A, string B)
et
void fonction(string A, bool B)
quand j'appelle
monobjet.fonction("foo", "blah");
il appelle la deuxieme !
alors qu'avec
monobjet.fonction("foo", string("blah"));
il appelle la premiere.
Qu'il faille specifier string("blah") pour obtenir un objet string
d'accord, puisque "unechaine" est en fait un const char* si je ne
m'abuse.
Mais alors pourquoi appelle t-il la premiere fonction sans broncher ?
Un const char* peut etre assimile a un bool ?
Oui, les pointeurs peuvent être implicitement convertis vers 'bool',
un pointeur null étant converti en 'false' et un autre pointeur
valide en 'true' - tout cela pour maintenir la compatibilité avec
le C, voir le C++ pré-standard, où on écrivait souvent
"if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard"
est considérée comme meilleure que la conversion "définie par
l'utilisateur" à l'aide du constructeur std::string(char const*)
(cf. § 13.3.3.2/2 du Standard)
La solution serait d'ajouter quelque chose comme
void fonction(string A, char const* B) { fonction(A, std::string(B)); }
das ta classe.
Dans une classe j'ai deux methodes de meme nom : void fonction(string A, string B) et void fonction(string A, bool B)
quand j'appelle
monobjet.fonction("foo", "blah");
il appelle la deuxieme ! alors qu'avec
monobjet.fonction("foo", string("blah"));
il appelle la premiere.
Qu'il faille specifier string("blah") pour obtenir un objet string d'accord, puisque "unechaine" est en fait un const char* si je ne m'abuse. Mais alors pourquoi appelle t-il la premiere fonction sans broncher ? Un const char* peut etre assimile a un bool ?
Oui, les pointeurs peuvent être implicitement convertis vers 'bool', un pointeur null étant converti en 'false' et un autre pointeur valide en 'true' - tout cela pour maintenir la compatibilité avec le C, voir le C++ pré-standard, où on écrivait souvent "if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard" est considérée comme meilleure que la conversion "définie par l'utilisateur" à l'aide du constructeur std::string(char const*) (cf. § 13.3.3.2/2 du Standard)
La solution serait d'ajouter quelque chose comme void fonction(string A, char const* B) { fonction(A, std::string(B)); } das ta classe.
Falk
v.p.
Rebonjour,
? Un const char* peut etre assimile a un bool ?
Oui, les pointeurs peuvent être implicitement convertis vers 'bool', un pointeur null étant converti en 'false' et un autre pointeur valide en 'true' - tout cela pour maintenir la compatibilité avec le C, voir le C++ pré-standard, où on écrivait souvent "if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard" est considérée comme meilleure que la conversion "définie par l'utilisateur" à l'aide du constructeur std::string(char const*) (cf. § 13.3.3.2/2 du Standard)
Ok. Merci beaucoup !
La solution serait d'ajouter quelque chose comme void fonction(string A, char const* B) { fonction(A, std::string(B)); } das ta classe.
C'est ce que j'ai fait :-) Encore merci pour cette reponse precise et rapide ! Vincent
Rebonjour,
? Un const char* peut etre assimile a un bool ?
Oui, les pointeurs peuvent être implicitement convertis vers 'bool',
un pointeur null étant converti en 'false' et un autre pointeur
valide en 'true' - tout cela pour maintenir la compatibilité avec
le C, voir le C++ pré-standard, où on écrivait souvent
"if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard"
est considérée comme meilleure que la conversion "définie par
l'utilisateur" à l'aide du constructeur std::string(char const*)
(cf. § 13.3.3.2/2 du Standard)
Ok. Merci beaucoup !
La solution serait d'ajouter quelque chose comme
void fonction(string A, char const* B) { fonction(A,
std::string(B)); }
das ta classe.
C'est ce que j'ai fait :-)
Encore merci pour cette reponse precise et rapide !
Vincent
Oui, les pointeurs peuvent être implicitement convertis vers 'bool', un pointeur null étant converti en 'false' et un autre pointeur valide en 'true' - tout cela pour maintenir la compatibilité avec le C, voir le C++ pré-standard, où on écrivait souvent "if(p)" ou while(!p) à la place de "if(p != 0)" ou "while(p == 0)".
Lors de la résolution de la surcharge, cette conversion "standard" est considérée comme meilleure que la conversion "définie par l'utilisateur" à l'aide du constructeur std::string(char const*) (cf. § 13.3.3.2/2 du Standard)
Ok. Merci beaucoup !
La solution serait d'ajouter quelque chose comme void fonction(string A, char const* B) { fonction(A, std::string(B)); } das ta classe.
C'est ce que j'ai fait :-) Encore merci pour cette reponse precise et rapide ! Vincent