Ü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 ambiguous

    lg



  • Weil die Regeln zur impliziten Konvertierung eingebauter Typen definiert sind. Wenn du hingegen die Parametertypen auf int und double setzt, dann nicht.



  • Afaik weil der Compiler sonst nicht weiss, ob er die Zahl als unsigned int oder als float interpretieren soll.


  • Mod

    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 double
    

    Und 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.


Anmelden zum Antworten