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
-
Dann probiere mal
static int
aus.
-
Das hat nichts mit Grunddatentypen zu tun.
Innerhalb einer Klassendeklaration bezeichnet einstatic
-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 eigenestatic
-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.