p
u
b
l
i
c
i
t
é
publicité
  1. #1
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 196
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 196
    Points : 5 983
    Points
    5 983

    Par défaut surcharge de fonction, bool et string

    Bonjour,

    je vous propose une petite question piège. Prenons le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void f( const std::string & str ) { std::cout << "string" << std::endl; }
    void f( bool b ) { std::cout << "bool" << std::endl; }
     
    main()
    {
       std::string str = "test";
       bool b = false;
     
       f( "test" );
       f( true );
       f( str );
       f( b );
       f( "" );
    }
    Question: quel est l'output de ce programme?

    Approfondissement de la question: pourquoi?

  2. #2
    Modérateur

    Homme Profil pro
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 697
    Points : 7 725
    Points
    7 725

    Par défaut

    Selon moi:
    bool
    bool
    string
    bool
    bool

    Tout simplement parce que "" est une chaîne vide, doit un const char* qui sera transtypé en bool avant std::string
    Pour forcer le transtypage en string, il faut l'expliciter avec f(std::string(""));

  3. #3
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 196
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 196
    Points : 5 983
    Points
    5 983

    Par défaut

    héhé, tu as évité un piège, mais tu es tombé dans le second ;p
    essaie de compiler...

    d'ailleurs, si quelqu'un a une version récente de gcc et pouvais tester, ça pourrait être intéressant (je n'ai pas de gcc sous la main).

  4. #4
    Inactif


    Homme Profil pro
    Inscrit en
    novembre 2008
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 308
    Points : 15 080
    Points
    15 080

    Par défaut

    J'aurais dit comme Bousk... et gcc confirme :
    bool
    bool
    string
    bool
    bool

  5. #5
    Modérateur

    Homme Profil pro
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 697
    Points : 7 725
    Points
    7 725

    Par défaut

    J'ai compilé (moyennant l'ajout des includes etc) sur visual 2010, et j'obtiens exactement ça

    Quel résultat as-tu ? Lequel attends-tu ?
    Images attachées Images attachées  

  6. #6
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 196
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 196
    Points : 5 983
    Points
    5 983

    Par défaut

    ooops oui, vous avez raison, my bad
    oui oui, j'obtiens bien la même chose avec ms vc.
    J'ai confondu sur le premier appel: f( "test" ); j'ai cru que tu disais que ça appelais la version f(const std::string &);

    Vous avez donc bien répondu tous les deux, sorry

  7. #7
    Membre émérite
    Inscrit en
    décembre 2008
    Messages
    533
    Détails du profil
    Informations forums :
    Inscription : décembre 2008
    Messages : 533
    Points : 868
    Points
    868

    Par défaut

    Il est quand même étrange que les appels 1 et 5 n'émettent pas une erreur "appel ambigu" à la compilation... puisque c'est manifestement le cas, non ?

  8. #8
    Inactif


    Homme Profil pro
    Inscrit en
    novembre 2008
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 308
    Points : 15 080
    Points
    15 080

    Par défaut

    Une petite source, pour les explications : http://en.cppreference.com/w/cpp/language/implicit_cast

    Ce qui se passe, c'est que le compilateur à le choix entre une conversion du pointeur en bool (voir la partie "Boolean conversions") ou appeler un constructeur de conversion. La règle de résolution des noms (indiqué en haut de page) indique qu'une conversion implicite standard est préférée à la conversion par appel d'une fonction définie par l'utilisateur

    EDIT : @cob59, sur MSVC, c'est l'erreur C4800 (mais je sais pas comment on l'active ou si elle est activée par défaut)

Discussions similaires

  1. API HOOK, Dump dll, Surcharge de Fonction
    Par MicroAlexx dans le forum Windows
    Réponses: 2
    Dernier message: 30/12/2005, 10h39
  2. [MFC] Surcharger des fonctions de CView
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 22/11/2005, 21h24
  3. singleton, polymorphisme, et surcharge de fonction
    Par legend666 dans le forum C++
    Réponses: 11
    Dernier message: 14/11/2005, 09h27
  4. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 13h25
  5. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo