statische felder -- mal wieder





  • Du musst die statischen Member definieren.

    class A {
    public:
    
        typedef unsigned int ResourceValue;
        static const ResourceValue MINIMUM_RESOURCE_VALUE = 0;
        static const ResourceValue MAXIMUM_RESOURCE_VALUE = 10000;
    
        A() {
        }
    
        A(const ResourceValue & rv) {
        }
    };
    
    const A::ResourceValue A::MINIMUM_RESOURCE_VALUE;
    const A::ResourceValue A::MAXIMUM_RESOURCE_VALUE;
    


  • Furble Wurble schrieb:

    Du musst die statischen Member definieren.

    Bei integralen Datentypen nicht, soweit ich weiß.

    Sieht aus, als wäre der Compiler kaputt.



  • MFK schrieb:

    Sieht aus, als wäre der Compiler kaputt.

    Ich vermute der hat in dem Fall sogar recht.
    Wenn man die Referenz im Konstruktor entfernt, dann gehts.....


  • Mod

    MFK schrieb:

    Furble Wurble schrieb:

    Du musst die statischen Member definieren.

    Bei integralen Datentypen nicht, soweit ich weiß.

    Sieht aus, als wäre der Compiler kaputt.

    Nein, das ist ein "Feature" (andere würden es "Fehlerverschleierung" nennen) bestimmter Compiler. Andere Implementierungen melden hier streng nach ISO-Standard einen Fehler.



  • das ist ja in der art komisch.

    wie gesagt, ohne reference im konstruktor geht es. auch wie es Furble Wurble vorgeschlagen hat. was ist nun korrekt????

    @Skym0sh0 der link geht bei mir nicht. lädt ewig ohne das was kommt. was hätte man da gesehen?



  • ah, da war SeppJ schneller. also ist die variante von Furble Wurble die standard konforme?



  • MFK schrieb:

    Furble Wurble schrieb:

    Du musst die statischen Member definieren.

    Bei integralen Datentypen nicht, soweit ich weiß.

    Sieht aus, als wäre der Compiler kaputt.

    Ich versuch mich mal wieder am Standard 🙂

    9.4.2 Static data members
    2
    The declaration of a static data member in its class definition is not a definition and may be of an incomplete type other than cv-qualified void. The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition.[...]

    3
    If a non-volatile const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer [...] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.

    somebody123 schrieb:

    MFK schrieb:

    Sieht aus, als wäre der Compiler kaputt.

    Ich vermute der hat in dem Fall sogar recht.
    Wenn man die Referenz im Konstruktor entfernt, dann gehts.....

    [Spekulation]Wahrscheinlich kriegt der Linker hier irgendwas zu fassen, wenn der Typ in der Signatur des C'tors auftaucht.[/Spekulation]



  • Skym0sh0 schrieb:

    Nix Fehler

    Ah: das ideone.com jetzt down ist, beendet meinen Beweis.
    q.e.d.

    😉



  • @sven_
    Die Variante mit Referenz und mit Definition ist OK.
    Die Variante ohne Referenz und ohne Definition ist auch OK.
    Nicht OK ist einzig die Variante mit Referenz aber ohne Definition. Denn dort wird das "Objekt" MINIMUM_RESOURCE_VALUE verwendet (Lvalue), nicht bloss der Wert (Rvalue). Und sobald das Objekt selbst verwendet wird, muss es auch definiert werden.

    Wobei viele Compiler sich trotzdem nicht an sowas stören.

    Ich finde diese Regel übrigens total doof. Technisch müssen Compiler bereits um Templates zu ermöglichen alles drauf haben, was nötig wäre, um die implizite Definition solcher static const zu ermöglichen.
    Also sollten sie es verdammtnochmal auch tun.


Anmelden zum Antworten