[gelöst] cTor und operator= bei static function?



  • Hallo,
    ich war lange lange weg vom C++ und fange jetzt wieder an. Natürlich fange ich wieder klein an und habe folgendes Verständnis Problem:

    alfColorBit a(alfColorBit::getBlue());
    alfColorBit b(alfColorBit(alfColorBit::getBlue())); // C2751
    auto c = alfColorBit(alfColorBit::getBlue());
    auto d = alfColorBit(alfColorBit(alfColorBit::getBlue()));
    

    Man erkennt an der Fehlermeldung, ich arbeite mit Visual Studio, derzeit in der Version 2015, was wohl keinen Unterschied macht.

    Meine Klasse "alfColorBit" hat folgende cTor und operator=

    alfColorBit() : a_value(0) {}
    alfColorBit(const alfColorBit& copy) : a_value(copy.a_value) {}
    alfColorBit(alfColorBit&& move) : a_value(std::move(move.a_value)) {}
    alfColorBit(const value_type& copy) : a_value(copy) {}
    alfColorBit(value_type&& move) : a_value(std::move(move)) {}
    void operator=(const alfColorBit& copy) { set(copy); }
    void operator=(alfColorBit&& move) { set(std::move(move)); }
    void operator=(const value_type& copy) { set(copy); }
    void operator=(value_type&& move) { set(move); }
    

    Die Funktion getBlue() wird aus einem Makro zusammen gebaut, schaut im Ergebnis aber so aus:

    static value_type getBlue() noexcept { return static_cast<value_type>(1 << 3); }
    

    So, und jetzt mein Problem:
    In meinem Code sollten alle 4 Zeilen das gleiche Ergebnis liefern. Im Endeffekt müsste ja der move-cTor das meiste abfeiern (das wollte ich mit dem Code eigentlich auch testen).
    Aber Zeile 2 und Zeile 4 werden unterschiedlich gewertet. In Zeile 2 erhalte ich...

    error C2751: "alfColorBit::getBlue": Der Name eines Funktionsparameters kann nicht qualifiziert sein
    

    ...was ich jetzt nicht verstehe, warum dort das "alfColorBit::getBlue()" nicht erlaubt ist, wobei es in Zeile 4 durchaus erlaubt ist. Beide Male müsste doch der Wert in den "inneren" cTor(const alfColorBit& copy) übergeben werden, und danach in den "äußeren" cTor(alfColorBit&& move) wandern, oder?

    Wo ist mein Denkfehler?
    Danke,
    Stefan


  • Mod

    alfColorBit b(alfColorBit(alfColorBit::getBlue())); // C2751
    

    sieht wie die Deklaration einer Funktion b aus - ohne redundante Klammern wird es deutlicher:

    alfColorBit b(alfColorBit alfColorBit::getBlue());
    

    https://en.wikipedia.org/wiki/Most_vexing_parse

    alfColorBit b((alfColorBit(alfColorBit::getBlue())));
    

    wäre möglich.



  • Ah jetzt ja, verstanden. Da wäre ich jetzt im Leben nicht drauf gekommen.
    Klappt super, Beitrag in die Lesezeichen aufgenommen 😉

    Danke schön.


Anmelden zum Antworten