Überladungsproblem
-
Hi,
Wieso ist hier unbedingt eine explizite Typumwandlung notwendig?:
#include <iostream> using namespace std; unsigned int umfang(unsigned int a, unsigned int b) { return((2 * a) + (2 * b)); } float umfang(float a, float b) { return((2 * a) + (2 * b)); } int main(void) { cout << "a = 3, b = 7, Umfang: " << umfang((unsigned int)3, (unsigned int)7) << endl; cout.precision(2); cout << fixed << "a = 3.5, b = 1.5, Umfang: " << umfang((float)3.5, (float)1.5) << endl; return(0); }Ohne die explizite Typumwandlung bekomm ich die Meldung:
call of overloaded 'umfang(double, double)' is ambiguouslg
-
Weil die Regeln zur impliziten Konvertierung eingebauter Typen definiert sind. Wenn du hingegen die Parametertypen auf
intunddoublesetzt, dann nicht.
-
Afaik weil der Compiler sonst nicht weiss, ob er die Zahl als unsigned int oder als float interpretieren soll.
-
Tipp: Auch Literale haben einen Typ und diesen kann man auch ändern:
0 int 0U unsigned int 0L long 0 UL unsigned long 0. double 0.f float 0.L long doubleUnd noch mehr Kombinationen, alternative Schreibweisen und ein paar Sonderregeln für char, die ich jetzt nicht alle hinschreiben möchte.
Damit kannst du dann
umfang(3U, 7U)schreiben und das funktioniert.