Template-Methode spezialisieren in Klassen-Template
-
Guten Abend,
angenommen wir haben folgende Klasse:
template<typename T> struct foo { template<typename U> T bar(U val); };
Ich würde gerne die Methode für diverse Typen spezialisieren. Ich versuche das wie folgt:
template<> template<typename T> T foo<T>::bar<int>(int val) {return T();}
Ich bekomme dabei folgenden Compiler-Fehler:
error C2244: 'bar' : unable to match function definition to an existing declaration
Könnte mir jemand weiterhelfen?
-
Lass mich nicht lügen, aber wenn du nur die Methode spezialisieren möchtest, müsste es dann nicht genau anders herum sein?
template<typename T> template<> T foo<T>::bar<int>(int val) {return T();}
ungetestet, meine aber, dass es irgendwas in der Richtung war.
-
Hätte jetzt spontan am morgen ungetestet das gleiche gesagt.
Lg freeg
-
Also in eurer Variation bekomme ich einen anderen Compiler-Fehler, den ich euch aber erst in einer Stunde posten kann. Jedenfalls ist der Kern der Fehlermeldung, dass es sich um eine ungültige Template-Spezialisierung handelt.
-
Error 3 error C2244: 'foo<T>::bar' : unable to match function definition to an existing declaration Error 1 error C2768: 'foo<T>::bar' : illegal use of explicit template arguments
-
Sicher dass die Klasse vor der Spezialisierung definiert wurde?
Kannst du vielleicht noch etwas mehr Code schicken mit allen includes und wie du die Dateien aufgeteilt hast?Und direkt in der Klasse kannst du die Spezialisierung nicht machen?
-
Danke für deine Antwort. Das war mein ganzer Code:
template<typename T> struct foo { template<typename U> T bar(U val); }; template<> template<typename T> T foo<T>::bar<int>(int val) {} int main() { return 0; }
Irgendwie muss das doch möglich sein?!
-
Hier kommen ein paar Sachen zusammen:
1. Du kannst Template Member eines Klassentemplates nur dann vollständig spezialisieren, wenn du auch die umgebende Klasse vollständig spezialisierst.
Möglicher Workaround: Gib dem inneren Template noch einen Dummy-Parameter
2. Dies führt dann zu Problem 2:
Du kannst Funktionstemplates nicht partiell spezialisieren
Workaround von 1 funktioniert hier nicht
.
Möglicher Workaround: Bastel einen Funktor (Funktionsobjekt mit einem Operator() ).
3. Dies führt zu Problem 3:
Das ist alles furchtbar kompliziert
Vergiss das alles von oben und mach einfach Funktionsüberladung:
template<typename T> struct foo { template<typename U> T bar(U val); T bar(int val); }; template<typename T>T foo<T>::bar(int val) {}
-
A function template can only be fully specialized, but because function templates can overload we can get nearly the same effect via overloading that we could have got via partial specialization.
Hab aber auf die schnelle auch noch keine Lösung gefunden. Aber so wie du es vor hast kannst du es nicht machen. Da die Klassen ja aus dem Template zur Kompilezeit generiert werden würde es mich auch wundern, wenn man sich noch irgendwo spezialisierte Member-Funktionen außerhalb dieser Klasse definieren könnte.