Konstanten vs. Konstruktoren mit Standardargumenten



  • Ich habe mal wieder ein Problem:

    const int lol = 500;
    
    class foo
    {
        public:
        foo (int a, int b = 50);
    };
    
    foo::foo (int a, int b)
    {
    }
    

    Wenn ich jetzt folgendes schreibe, funktioniert es:

    int main (void)
    {
        foo rofl(10);
        return(0);
    }
    

    Folgendes funktioniert aber nicht:

    int main (void)
    {
        foo rofl(lol);
        return(0);
    }
    

    Ich kriege dann immer den Fehler: Keine passende Funktion für den Aufruf foo() gefunden. Kandidaten: foo(int, int) und foo(const foo&).

    Wieso geht das mit dem Literal, aber nicht mit der Konstanten??

    P.S: Ich habs mit Dev-Cpp und dem Micro$oft Compiler ausprobiert. Bei beidem der gleiche Fehler. Woran liegt das??

    EDIT: Mit dem Comeau funktioniert alles prächtig. Komisch...

    Mfg

    Felix



  • weil du ein const int nicht in ein int wandeln kannst.
    dazu bräuchtest du const_cast, aber das wär auch recht böse.

    Devil



  • devil81 schrieb:

    weil du ein const int nicht in ein int wandeln kannst.

    Quark.

    Ich kann das Problem übrigens nicht nachvollziehen, bei mir geht es.



  • EDIT: Ah ich weiß, was der Fehler war:

    Ich habe in main keinen Namen für die Instanz von foo angegeben. Das einzig komische ist aber trotzdem folgendes:

    int main (void)
    {
        foo (10);
        return (0);
    }
    

    Funktioniert,

    int main (void)
    {
        foo (lol);
        return(0);
    }
    

    allerdings nicht.

    Der erste Fehler (ich gestehe es ein 😡 ) war, dass ich keinen Namen für die Instanz von foo, die ich anlegen wollte, gibt. Wenn ich einen Angebe, funktioniert es. Jetzt frage ich mich aber trotzdem, wieso es funktioniert, wenn man ein Literal angibt, aber nicht, wenn man die Konstante übergibt. Das mit dem Literal funktioniert nämlich sogar, obwohl ich keinen Namen für die Instanz angegeben habe.

    Nochmal Sorry wegen meinem Fehler im ersten Post

    Felix



  • Ich glaube foo(lol); wird als Deklaration angesehen und ist syntaktisch gleichbedeutend mit foo lol;, und das geht natürlich schief, weil du keinen Default-Konstruktor hast. Die Syntax der Direkt-Initialisierung A B(C, D, ...); scheint allgemein besonders fehleranfällig zu sein, es gibt einige böse Mehrdeutigkeiten in diesem Bereich.


Anmelden zum Antworten