004
30.07.2008, 19:05 Uhr
0xdeadbeef
Gott (Operator)
|
Nachtrag dazu:
Der Grund, warum es mit normalen statischen Variablen so nicht geht, ist, dass der Compiler nur die eine Übersetzungseinheit kennt, und nicht entscheiden kann, welche zur Laufzeit nachher zuerst initialisiert werden muss. Außerdem gibt es syntaktisch korrekte Konstrukte, die semantisch keinen Sinn ergeben und die ganze Geschichte böse durcheinander brächten - stell dir zum Beispiel
C++: |
// header extern int a, b;
// source 1 int a = b;
// source 2 int b = a;
|
vor. Mit Templates sind die Regeln deutlich komplexer, weil die ja erst zu Klassen/Funktionen konkretisiert werden müssen - dementsprechend ist
C++: |
template <class T> const A<T> A<T>::PreInitData= 100.0;
|
noch keine Instanziierung von A<float>::PreInitData - dem Compiler wird erst bekannt, dass er die bauen soll, wenn sie zum ersten mal benutzt wird. Wenn ich den Standard richtig lese, ist in deinem Fall ist zu diesem Zeitpunkt die Deklaration von B::p für den Compiler vor der von A<float>::PreInitData vorhanden, und so wird B::p vor A<float>::PreInitData gebaut. Dass du dabei 0.0 als Wert kriegst, ist allerdings eine Besonderheit deines Compilers, der kann dir da prinzipiell alles mögliche andrehen. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra |