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
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". –
Sieht aus wie ein Tippfehler. Das Ändern aller "checkit" zu "checkIt" erhält das erwartete Ergebnis. – InternetAussie
Ja, es gibt eine Standardkonvertierung von 'bool' nach' int'. – AnT