Linker Fehler bei static Member-Vector auf Klassen instanzen



  • Ich habe eine kleine Klasse in der sich ein static Vector aus Zeigern auf Instanzen der Klasse befindet,leider bringt mir der Linker folgenden Fehler den ich mir nicht erklären kann:

    Fehler	LNK2001	Nicht aufgelöstes externes Symbol ""protected: static class std::vector<class foo*,class std::allocator<class foo*> > foo::instances" (?instances@foo@@1V?$vector@PAVfoo@@V?$allocator@PAVfoo@@@std@@@std@@A)".	
    
    
    Mein Code:
    ```cpp
    class foo;
    
    class foo{
    foo(){
    instances.push_back(this);
    }
    static std::vector<foo*>instances;
    }
    

    Wenn ich den Vector nicht als static definiere funktioniert auch alles,aber leider muss er static sein.
    Vieleicht kann mir ja jemand helfen.
    Danke im Vorraus



  • Du hast die Variable deklariert, aber nicht definiert. Das gehört in dein .cpp-File:

    std::vector<foo*> foo::instances;
    


  • Mit C++ 17: inline static std::vector<foo*>instances;

    sonst musst die die Variable auch irgendwo (nicht im Header) noch definieren: std::vector<foo*> foo::instances;



  • @Bashar Vielen dank das funktioniert,aber warum muss ich das noch in der .cpp file definieren das macht man doch bei Grunddatentypen zum Beispiel auch nicht



  • @Thorsten54

    Dann probiere mal static int aus.



  • Das hat nichts mit Grunddatentypen zu tun.
    Innerhalb einer Klassendeklaration bezeichnet ein static-Member nur eine Deklaration, d.h. es entspricht
    extern static ..., d.h. es muß noch genau eine Definition dafür geben (in genau einer Translation Unit (bzw. Compilation Unit)).
    In einer Headerdatei geht das nicht, weil sonst würde bei jedem Einbinden dieser Headerdatei eine eigene static-Instanz dafür angelegt werden (und auch dann würde sich der Linker beschweren, weil es dann mehrere Definitionen gäbe).



  • Das geht schon (seit C++17, was ich zugegeben auch nicht ständig auf dem Schirm habe), wie @manni66 schon erwähnt hat, mit inline.
    Ob man das machen sollte, weiß ich nicht. Ich vermute mal, das ist sinnvoll bei Klassentemplates oder sonst Klassen, die aus irgendeinem Grund komplett im Header definiert sind, für die man nicht extra ein Implementationsfile mit der einen Definition anlegen will.