static Membervariablen automatisch instanziieren
-
Und der Fehler lautet...
-
groovemaster schrieb:
Und der Fehler lautet...
ODR beachten!
Wenn es im Header wäre, würde ja jede ÜE die diesen Header einbindet, diese statische Variable definieren - das mag die ODR aber nicht.
-
Und wie macht man das dann richtig? Geht sowas überhaupt, oder scheitert es einfach daran, dass kaum ein Compiler export unterstützt? Wenn ich den static Template Member so wie otze in die .cpp schreibe, wird doch noch nix instanziert?
-
Es gibt da schon ne Möglichkeit das in den Header zu schreiben:
#ifdef ALLREADY_INTIALIZED extern #else #define ALLREADY_INITIALIZED #endif template<class T> T foo<T>::o;
Bitte nicht hauen
-
doch, genau einmal. es geht nur darum, dass der compiler eine stelle findet,an der er den speicher reinpacken kann
-
SirLant schrieb:
Bitte nicht hauen
Nur doof, dass es trotzdem nicht geht.
Ich müsste ja händisch ALLREADY_INITIALIZED definieren
btw: es heisst already
-
Ok stimmt already und wieso sollte es trotzdem nicht gehen? Abgesehen davon, dass ich mich beim #ifdef verschrieben habe...
-
SirLant schrieb:
Ok stimmt already und wieso sollte es trotzdem nicht gehen? Abgesehen davon, dass ich mich beim #ifdef verschrieben habe...
Du verhinderst damit lediglich den Problem, dass die Variable mehrfach pro ÜE definiert wird. Wenn ich jetzt aber eine andere ÜE kompiliere, die auch diese Datei einbindet, ist ALREADY_DEFINED ja nicht gesetzt (der Compiler merkt sich das ja nicht - was ja auch gut ist - sonst würden Include Guards nicht mehr funktionieren) und definiert die Variable also nocheinmal. zwar nur 1x pro ÜE (aber das würden Include Guards auch erledigen).
-
otze schrieb:
doch, genau einmal. es geht nur darum, dass der compiler eine stelle findet,an der er den speicher reinpacken kann
Kann ich mir nicht vorstellen. Immerhin steht der Compiler ja vor dem Problem, einen unbekannten Template Parameter auflösen zu müssen. Deine Lösung mag mit extern gehen, aber da wie gesagt kaum ein Compiler das unterstützt, nicht wirklich hilfreich.
Da ich selbst schon solche static Template Member benutzt hab, und bisher offensichtlich falsch, würde mich eine richtige Lösung schon mal interessieren. Bisher hab ich alles in die Headerdatei geschrieben und mein Compiler hat sich bisher wegen ODR Verletzung nicht beklagt (was aber nichts heissen muss). Und im Standard hab ich bis auf ein Beispiel auch noch nicht wirklich was hilfreiches dazu gefunden.
-
groovemaster schrieb:
Sollte
template<class T> T foo<T>::o;
nicht auch in den Header?
Jup. Genau dort sollte die Definition hin.
Anders sieht es aus, wenn du die statischen Member einer expliziten Spezialisierung definierst. Diese Definitionen gehören dann in eine cpp-Datei.wenn dus schaffst, den compile error auszuschalten
Und welcher sollte das bitte sein? Du spielst wohl auf einen Linkerfehler an, aber auch der darf nicht auftreten.
ODR beachten!
Wo wird hier die ODR verletzt? Templatedefinitionen dürfen einmal pro Übersetzungseinheit auftreten und dazu gehören auch die Templatedefinitionen statischer Memberdaten eines Templates. Wie der Compiler dann dafür sorgt, dass die Definition des konkreten Members (also nachdem der Compiler aus dem Template eine echte Klasse gemacht hat) nur genau einmal im Programm auftaucht ist seine Sache.
Ansonsten steht hier irgendwie viel Käse...
-
Puh, doch nix falsch gemacht. Thx für deine Erklärung HumeSikkins.
HumeSikkins schrieb:
Ansonsten steht hier irgendwie viel Käse...