Template-Spezialisierung wird nicht genutzt
-
Hi!
Und schon wieder hab ich ein Problem mit Templates. Von einer Klassen-Methode
hab ich einmal eine allgmeine Template Variante und eine Spezialisierung
für den Typ string. Nur leider wird generell (sagt der Debugger) die
allgemeine Variante aufgerufen, auch wenn ich explizit string als Typ
angebe.Hier mal der Code:
class LevelParser { public: template <class T> T GetAttributeValue(string& attribute, string& tag, string parent="") { [...] } template <string> string GetAttributeValue(string& attribute, string& tag, string parent="") { [...] } [...]
Der Aufruf:
levelParser.GetAttributeValue<string>(string("value"), string("file"));
Aufgerufen wird leider die allgemeine Variante
Ich möchte mich an dieser Stelle auch schon mal bei den Postern meines letzten
Threads bedanken (wollte nicht spammen) - vor allem HumeSikkins hat mir
deutlich gemacht, dass ich noch einiges zu lernen hab...MfG,
EnERgYzEr
-
ganz einfacher grund: die string funktion ist keine template funktion, und durch den speziellen template parameter wird immer die allgemeine variante aufgerufen.
-
otze schrieb:
ganz einfacher grund: die string funktion ist keine template funktion, und durch den speziellen template parameter wird immer die allgemeine variante aufgerufen.
Hm... Das versteh ich noch nicht
Was meinst du mit "die string funktion ist keine template funktion"? Soweit
ich die Spezialisierung verstanden habe, braucht eine Template-Funktion doch
keine Parameter mehr, oder?
-
hab mich mies ausgedrückt.
also so sollte es funktionieren:template <class T> T GetAttributeValue(string& attribute, string& tag, string parent="") { [...] } template <> string GetAttributeValue<string>(string& attribute, string& tag, string parent="") { [...] } [...]
-
Danke! Jetzt funktionierts! Hatte mir aus verschiedenen Quellen das falsche
zusammengesammelt
-
Eigentlich sollte dein Code nicht funktionieren, da allein durch den Rückgabewert der Template Parameter nicht hergeleitet werden kann.
-
groovemaster schrieb:
Eigentlich sollte dein Code nicht funktionieren, da allein durch den Rückgabewert der Template Parameter nicht hergeleitet werden kann.
doch, er gibt ihn ja an
[cpp]levelParser.GetAttributeValue**<string>**(string("value"), string("file"));[/cpp]
-
Ergänzend dazu: Gibt es denn auch eine Möglichkeit, dass als Default-Einstellung
immer string genommen wird, so dass ich nicht immer <string> angeben muss?// Edit: template <class T=string> geht ja leider nicht
-
nein, du kannst aber eine version schreiben, die kein template ist
-
otze schrieb:
nein, du kannst aber eine version schreiben, die kein template ist
Laaaaangweilig
:p