Templatespezialisierung forwarden
-
Hi Leute,
ich habe folgendes Problem: Ich habe ein Klassentemplate und eine Spezialisierung dazu. Wenn ich aber im Code das Klassentemplate verwenden will, an einer Stelle an der die Spezialisierung noch nicht zur Verfügung steht nimmt der Compiler ja die unspezialisierte Variante, obwohl später ja noch eine spezialisierte kommt
Kann man die spezialisierte Variante irgendwie "forwarden"?
-
Indem du sie vorwärtsdeklarierst?
Bsp.:template <typename> struct foo; template <typename> struct foo<int>;
-
Wenn ich das Template verwende, muss doch die Klasse schon vollständig zur Verfügung stehen. Oder irre ich mich da?
-
Ja. Vielleicht habe ich dich auch nicht richtig verstanden. Kannst du etwas Code zeigen?
-
template <typename T> struct foo { }; foo<int> bla; template <> struct foo<int> { }
Gibt mir die Fehlermeldung
error C2908: Explizite Spezialisierung; 'foo<T>' wurde bereits instanziiert
Die Spezialisierung muss also vor der Verwendung stehen
Wie kann man das umgehen?Weil sonst hätte man ja bei folgendem Codekonstrukt ein ziemliches Problem:
template <typename> struct foo { }; template <> struct foo<int> { void bar() { foo<float> f; } }; template <> struct foo<float> { void bar() { foo<int> f; } };
-
Das kann man nicht umgehen. Dann musst du wohl in deinem zweiten Beispiel die Methode erst Vorwärtsdeklarieren und nach der Spezialisierung implementieren.
-
hm stimmt ich kann die methode ja auch später implementieren
-
was ist das denn bitte für ein schlechtes design!
-
und sowas einfach:
template <typename> struct foo; template <> struct foo<int>; template <> struct foo<float>; // jetzt die Implementierungen...
Bin mir aber nicht ganz sicher.
-
Was soll das forwarden einer Spezialisierung denn bringen?