Unresolved External bei template + static
-
Ich habe folgende Kalsse:
template<class T> class Test{ public: static Test* p; Test(void) { p = this; } };Wieso darf ich hier nicht auf die statische Variable zugreifen?
-
In einer Datei muss folgendes stehen:
template <class T> Test<T>* Test<T>::p = 0;/edit hihi, da mischt sich der :p smiley ein
-
Vielen Dank.
Hatte genau das schon probiert, nur leider nicht mit der richtigen Syntax
Mal rein technisch gesehen: Warum braucht der Compiler da diese Initialisierung in der Implementierung?
-
Kann das keiner erklären?
-
Um zu wissen wo die Variable angelegt werden soll. Ansonsten wäre der Compiler gezwungen überall dort wo das Header includiert wird die Variable anzulegen und das könnte unter umständen problematisch sein....
-
Warum braucht der Compiler da diese Initialisierung in der Implementierung?
Der Compiler braucht nicht unbedingt eine Initialisierung sondern eine Definition. Der Grund dafür ist ganz einfach, dass es sich bei der Nennung einer statischen Variable innerhalb einer Klassendefinition erstmal nur um eine Deklaration handelt und eine solche noch keinen Speicher für die Variable bereitstellt.
Das ganze ist unabhängig von Templates. Siehe:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39471.html
Der Unterschied bei Templates ist nur, dass die Definition überall sichtbar sein muss und deshalb auch in der Header-Datei endet.
-
Hmm, gibt das dann keinen Linkerfehler und wenn ja, wieso nicht?
-
.filmor schrieb:
Hmm, gibt das dann keinen Linkerfehler und wenn ja, wieso nicht?
Wann? Wenn du die Definition im Header schreibst? Nein, dann gibt es keinen Linkerfehler. Der Grund dafür ist der, dass für Templates andere ODR (one definition rule)-Regeln gelten. Template-Definitionen dürfen einmal pro Übersetzungseinheit existieren. Es ist Aufgabe des Compilerherstellers dafür zu sorgen, dass am Ende im Programm nur genau eine Definition existiert. Auf jeden Fall muss die Definition überall dort sichtbar sein, wo sie benutzt wird. Ansonsten kommt es zu Linkerfehlern

-
HumeSikkins schrieb:
Der Grund dafür ist der, dass für Templates andere ODR (one definition rule)-Regeln gelten.
Wo werden diese Regeln im Standard beschrieben? Aus dem ersten Blick auf das Inhaltsverzeichnis werde ich noch nicht ganz schlau. -.-
-
7H3 N4C3R schrieb:
HumeSikkins schrieb:
Der Grund dafür ist der, dass für Templates andere ODR (one definition rule)-Regeln gelten.
Wo werden diese Regeln im Standard beschrieben? Aus dem ersten Blick auf das Inhaltsverzeichnis werde ich noch nicht ganz schlau. -.-
Was hälst du z.B. von 3.2/5?
-
*an den Kopf fass* Ich hab das 14.er Kapitel komplett umgegraben... warum so einfach

-
spirit monger schrieb:
Mal rein technisch gesehen: Warum braucht der Compiler da diese Initialisierung in der Implementierung?
Normallerweise benutzt man das Templatemodel wie Hume es vorgestellt hat. Das heißt Deklaration und Definition in jede Datei. In diesem Fall braucht der Compiler, aus technischer Sicht, diese Definition nicht da sie, abgesehen von der Initialisierung, keine weiteren Informationen bereit hält. Da ja sowohl Deklaration und Definition in jeder Datei sind impliziert die Existente einer Deklaration, im Gegensatz zu normalen Klassen, ja auch die Definition. Allerdings gibt es noch andere Templatemodele : Explizite Instanzirung und export. Bei beiden wird eine Deklaration nicht immer von einer Definition begleitet und daher spielt diese Definition bei ihnen schon eine technische Rolle.