2017-06-25 3 views
1

In dem folgenden Testprogramm ruft das Aufrufen der checkit-Methode mit einem Bool-Prädikat stattdessen die Integer-Überladung auf. Warum?C++ Bool-Ausdruck als Funktionsargument ruft falsche Überladung auf

sollte einen booleschen Wert erstellen, der dann die Bool-Überladung ausgelöst werden soll, um zu starten, nein?

Programm Ausgabe

should be int 
    I'm a bool 1 
should be bool 
    I'm a bool 1 
should also be bool 
    I'm a int 1 

Quelle

class Overload 
{ 
public: 
    void checkIt(bool n) { printf(" I'm a bool %d\n", n); } 
    void checkit(long n) { printf(" I'm a long %ld\n", n); } 
    void checkit(int n) { printf(" I'm a int %d\n", n); } 
}; 

int main(int argc, char *argv[]) 
{ 
    Overload obj; 

    int i = 10; 
    bool b = true; 

    printf("should be int\n"); 
    obj.checkIt(i); 

    printf("should be bool\n"); 
    obj.checkIt(b); 

    printf("should also be bool\n"); 
    obj.checkit((i == 10)); 
} 

EDIT

Duh! Entschuldigung für den Tippfehler.

Allerdings, nach der Fixierung Tippfehler und die Bool-Methode kommentieren, wird die int-Methode mit dem Bool-Prädikat aufgerufen. Gibt es eine Standardkonvertierung von bool nach int, wenn keine passendere Signatur gefunden wird? Streng genommen gibt es keine bool Unterschrift so erwartete ich entweder einen Compiler oder Laufzeitfehler ...

Aktualisiert-Code

class Overload 
{ 
public: 
    //void checkIt(bool n) { printf(" I'm a bool %d\n", n); } 
    void checkIt(long n) { printf(" I'm a long %ld\n", n); } 
    void checkIt(int n) { printf(" I'm a int %d\n", n); } 
}; 

int main(int argc, char *argv[]) 
{ 
    Overload obj; 

    int i = 10; 
    bool b = true; 

    printf("should be int\n"); 
    obj.checkIt(i); 

    printf("should be bool\n"); 
    obj.checkIt(b); 

    printf("should also be bool\n"); 
    obj.checkIt((i == 10)); 
} 

Aktualisiert Ausgang

should be int 
    I'm a int 10 
should be bool 
    I'm a int 1 
should also be bool 
    I'm a int 1 
+0

Sie haben nur eine Überladung von einer Funktion namens 'checkIt', so dass das einzige, das möglicherweise aufgerufen werden kann. Es gibt zwei nicht verwandte Überladungen einer Funktion mit einem anderen Namen, "checkit". –

+0

Sieht aus wie ein Tippfehler. Das Ändern aller "checkit" zu "checkIt" erhält das erwartete Ergebnis. – InternetAussie

+1

Ja, es gibt eine Standardkonvertierung von 'bool' nach' int'. – AnT

Antwort

4

checkIt isn‘ t überlastet; Es gibt nur eine bool Version.

checkit ist überlastet; Es gibt eine long und eine int Version.

Ihr Code ruft zweimal checkIt auf und checkit einmal.

+0

Andersherum: ein 'checkIt', zwei' checkit's –

+0

@IgorTandetnik Bearbeitet. – melpomene

+0

Danke melphomene, du hast mir den Schlaf gerettet, ich dachte, es würde verrückt werden :-) – Serge

0

Denken Sie daran, dass Funktionsnamen (und fast alles andere) in C++ CaSe SeNsItIvE sind.
In Ihrem aktualisierten Code gibt es 2 checkIt Methoden, eine für int Typ und eine für long Typ. Sie haben checkIt 3 Mal aufgerufen, und die 2 letzten Male, die Sie an die Methode einen bool Wert übergeben. In C++ automatisch bool Wert int mit true == 1 wirft und false == 0

bool a = 1 // equals to true 
bool b = 0 // equals to false 

Da es keine Methoden akzeptieren boolsche Typ sind, wirft der Wert automatisch auf int und ruft die Methode int.

0

Ja C++ verwendet implizite Konvertierung.bool, char wird automatisch in int/short/long konvertiert oder umgekehrt.

Verwandte Themen