explizite Spezialisierung und static Member
-
Hallo,
ich habe folgende Template Klasse
template <class T> class A { //... };Davon existiert nun eine explizite Spezialisierung mit einem static Member
template <> class A<double> { static const double b; };Soweit mir bekannt ist, muss nun die Definition laut 14.7.3/5 wie folgt aussehen:
const double A<double>::b = /*...*/;Dies schluckt der MSC auch problemlos und gibt bei folgender Version einen Fehler aus:
template <> const double A<double>::b = /*...*/;GCC akzeptiert jedoch beides anstandslos.
Ist das nun ein Fehler beim GCC? Oder habe ich irgendetwas übersehen?
-
Der Comeau lässt letzteres im strict mode nicht durchgehen, bei ersterem gibt er keinerlei Hinweis aus.
Also kann man wohl ziemlich sicher sagen, dass ersteres dem Standard entspricht und zweiteres nicht.
-
Hmmm...dann hat wohl GCC (respektive MinGW) hier noch Nachholbedarf.
-
Um welche GCC Version geht's denn? (Glaskugel ist in Reinigung
)
-
Also mein MinGW (g++ (GCC) 3.4.4 (mingw special)) schluckt beides problemlos, während der VC8 bei letzterem einen Fehler ausgibt ...
Wie genau sieht dein Code dafür aus?
-
LordJaxom schrieb:
Um welche GCC Version geht's denn? (Glaskugel ist in Reinigung
)MinGW
http://www.mingw.org/
Version 3.4.5
Bingo! 
Nee, aber mal Spass beiseite. Es geht um die "Candidate" MinGW Version, also 3.4.5..filmor schrieb:
Wie genau sieht dein Code dafür aus?
Wie meinst du das? Der Code sieht vereinfacht genauso aus, wie ich ihn bereits gepostet habe. Natürlich ist in den Klassen noch mehr Inhalt, für das Problem aber irrelevant.
-
groovemaster schrieb:
.filmor schrieb:
Wie genau sieht dein Code dafür aus?
Wie meinst du das? Der Code sieht vereinfacht genauso aus, wie ich ihn bereits gepostet habe. Natürlich ist in den Klassen noch mehr Inhalt, für das Problem aber irrelevant.
Schon klar, ich meinte eher wie das so dateimäßig aussieht. Ich hab einfach alles in eine Datei geschrieben, aber so dachtest du dir das wahrscheinlich nicht...
Und wie ich gerade gesehen habe, habe ich mich wohl verlesen

-
.filmor schrieb:
Schon klar, ich meinte eher wie das so dateimäßig aussieht. Ich hab einfach alles in eine Datei geschrieben, aber so dachtest du dir das wahrscheinlich nicht...
Doch, kann man durchaus so machen. Wenn du willst, kannst du aber auch die Klasse in einen Header stecken, und die Definition in die .cpp. Ist für die eigentliche Problematik nicht von Bedeutung.
Übrigens nochwas:
kompiliert wurde beim MSC mit/W4und beim GGC mit
-std=c++98 -Wall -Wextra -pedantic
-
Hallo,
syntaktisch gesehen, sind beide Varianten legal. Welche die richtige ist, ist abhängig von der konkreten Situation.Wenn du ein Template X hast, dass ein statisches Element i enthält welches normalerweise mit 42 initialisiert wird, du für den Fall, dass X mit int instanziiert wird i aber gerne mit 22 belegen würdest, dann schreibst du:
template <class T> struct X { static int i; }; template <class T> int X<T>::i = 17; template<> int X<int>::i = 22;Du spezialisierst somit X<T>::i für T = int.
Wenn du allerdings das ganze Template explizit spezialisiert hast (die resultierende Klasse ist kein Template mehr) und du ein statisches Member dieser Spezialisierung definieren willst, dann muss das template<> wegbleiben:
template <class T> struct X { static int i; }; template <> struct X<int> { static int i; }; template <class T> int X<T>::i = 17; int X<int>::i = 22;Hier definiertst du das i der Spezialisierung von X für int.
Da die explizite Spezialisierung eines Templates vorang vor einer expliziten Member-Spezialisierung eines Templates hat, ist:template<> int X<int>::i = 22;hier nicht erlaubt.
-
HumeSikkins schrieb:
Wenn du allerdings das ganze Template explizit spezialisiert hast (die resultierende Klasse ist kein Template mehr) und du ein statisches Member dieser Spezialisierung definieren willst, dann muss das template<> wegbleiben
Also liegt hier, wie ich bereits vermutete, ein Fehlverhalten beim GCC vor!?
Es geht mir dabei ausschliesslich um die explizite Spezialisierung. Die ursprüngliche Template Klasse hat diesen Member auch gar nicht.
-
groovemaster schrieb:
HumeSikkins schrieb:
Wenn du allerdings das ganze Template explizit spezialisiert hast (die resultierende Klasse ist kein Template mehr) und du ein statisches Member dieser Spezialisierung definieren willst, dann muss das template<> wegbleiben
Also liegt hier, wie ich bereits vermutete, ein Fehlverhalten beim GCC vor!?
Korrekt. Wobei dieses Fehlverhalten beim GCC in der Version 4.0.1 nicht mehr auftritt.
-
Na dann will ich mal hoffen, dass MinGW irgendwann in absehbarer Zeit auch für Version 4.x verfügbar sein wird.

Jedenfalls danke an alle.