Template-Member-Funktion-Spezialisierung
-
Wieso macht das hier beim Übersetzen keine Probleme ...
template <typename _element> class Test { public: _element getElement() const throw() { return element; } _element element; }; template <> class Test<int> { public: int getElement() const throw() { return 0; } };
... und das hier schon:
class Test2 { public: template <typename _element> void xxx( _element element ) {} }; template<> void Test2::xxx<int>( int element ) { std::cerr << "int!\n"; }
Hier gibt es einen Linkerfehler. Angeblich ist die Funktion xxx<int> mehrfach definiert.
Die beiden Klassen stecken in der gleichen Headerdatei.Wo steckt mein Fehler? Darf ich so nicht spezialisieren?
-
class Test2 { public: template <typename _element> void xxx( _element element ) {} template<> inline void xxx(int); }; template<> inline void Test2::xxx<int>( int element ) { std::cerr << "int!\n"; }
-
Shlo schrieb:
class Test2 { public: template <typename _element> void xxx( _element element ) {} template<> inline void xxx(int); }; template<> inline void Test2::xxx<int>( int element ) { std::cerr << "int!\n"; }
Das ist kein Standard-C++. Explizite Spezialisierungen sind nur im Namespace-Scope erlaubt. Nicht aber im Klassen-Scope.
Korrekt wäre:
class Test2 { public: template <typename _element> void xxx( _element element ); }; template <class T> void Test2::xxx (T e) {} template<> void Test2::xxx<int>( int element ) { }
-
HumeSikkins schrieb:
Das ist kein Standard-C++. Explizite Spezialisierungen sind nur im Namespace-Scope erlaubt. Nicht aber im Klassen-Scope.
Das verstehe ich nicht ganz, heißt es dass nichtmal die Deklaration der explizit spezialisierten Member-Funktion im Klassen-Scope erfolgen darf?
-
Shlo schrieb:
HumeSikkins schrieb:
Das ist kein Standard-C++. Explizite Spezialisierungen sind nur im Namespace-Scope erlaubt. Nicht aber im Klassen-Scope.
Das verstehe ich nicht ganz, heißt es dass nichtmal die Deklaration der explizit spezialisierten Member-Funktion im Klassen-Scope erfolgen darf?
Genau so ist es. Zumindest derzeit. Vielleicht ändert sich das ja in C++0x.
-
Vielen Dank so weit!
Immerhin weiß ich jetzt, daß ich die Spezialisierung der Funktion noch richtig gemacht habe.Aber mir ist nicht klar, wieso es beim Linken einen Unterschied zwischen spezialisierten Klassen und spezialisierten Funktionen gibt. Die Spezialisierung der Klasse funktioniert prima, aber bei Spezialisierung einer Funktion gibt es folgende Fehlermeldung: multiple definition of `void Test2::xxx<int>(int)'.
Hat jemand eine Ahnung warum das so ist?
-
aber bei Spezialisierung einer Funktion gibt es folgende Fehlermeldung: multiple definition of `void Test2::xxx<int>(int)'.
Hat jemand eine Ahnung warum das so ist?Die explizite Spezialisierung ist kein Template mehr. Es gelten hier also die ODR-Regeln für normale Funktionen -> Eine Definition, nicht eine Definition pro ÜE. Wenn du die explizite Spezialisierung also in einem Header definieren willst, musst du die Funktion inline deklarieren. Ansonsten solltest du die explizite Spezialisierung im Header deklarieren und in einer cpp-Datei definieren.
Danach sollte sich dein Linker nicht mehr beschweren.
-
Endlich ein Ende meiner erfolglosen Versuche selbständig eine Lösung zu finden.
So funktioniert's jetzt endlich.
Vielen Dank!