Schon wieder Probleme mit Templates -.-
-
die dinger mögen mich nicht

Diesesmal weiß ich aber nicht, ob es an mir oder am veralteten Compiler liegt
folgendes Konstrukt:
class MyClass { public: template<class T> inline std::map<int, T> getMap() const; private: std::map<int, Enum1> _enum1_map; std::map<int, Enum2> _enum2_map; }; template<> inline std::map<int, Enum1> MyClass::getMap() const { return _enum1_map; } template<> inline std::map<int, Enum2> MyClass::getMap() const { return _enum2_map; } ...kurzum: welche Member zurückgegeben wird, entscheidet das Template.
unter gcc 4.3.2 kompiliert es brav durch
unter SUN C++ 5.8 kommt folgender Fehler:
Error: Could not find a match for MyClass::getMap<MyClass::T>() const.
-
Und in welcher Zeile kommt der Fehler?

Ad veralteter Compiler: Der C++-Compiler von SIEMENS z.B. kommt nicht mit Funktionstemplates klar, wenn die Templateparameter nicht in der Liste der Funktionsparameter benutzt werden.
EDIT:
Müsste die Spezialisierung nicht so lauten? (Kenne mich mit Funktionstemplatespezialisierungen nicht so aus, weil ich sie meide wie der Teufel das Weihwasser
)template<> std::map< int, Enum1 > MyClass::getMap< Enum1 >() constWarum nimmst Du keine Überladungen?
-
LordJaxom schrieb:
Und in welcher Zeile kommt der Fehler?

im obigen Beispiel Zeile 13
LordJaxom schrieb:
Ad veralteter Compiler: Der C++-Compiler von SIEMENS z.B. kommt nicht mit Funktionstemplates klar, wenn die Templateparameter nicht in der Liste der Funktionsparameter benutzt werden.
sieht gut aus, kompiliert bisher brav durch. Schonmal danke
-
LordJaxom schrieb:
EDIT:
Müsste die Spezialisierung nicht so lauten? (Kenne mich mit Funktionstemplatespezialisierungen nicht so aus, weil ich sie meide wie der Teufel das Weihwasser
)template<> std::map< int, Enum1 > MyClass::getMap< Enum1 >() constklappt beides, also nehm ich erstmal das, was kürzer ist

Warum nimmst Du keine Überladungen?
Das hätte ich gemacht, wenn der Compiler es nicht geschluckt hätte. Ich wollt einfach mal sehen, ob das so klappt
-
zwutz schrieb:
Das hätte ich gemacht, wenn der Compiler es nicht geschluckt hätte. Ich wollt einfach mal sehen, ob das so klappt
Ich muss anfügen, dass der Hinweis sowieso quatsch war, da man Funktionen ja garnicht nur anhand ihres Rückgabetyps überladen kann. Das funzt sowieso nur, wenn der Templateparameter auch Funktionsparameter ist.