2011-01-09 8 views
0

Ich habe Schwierigkeiten, die richtige Syntax für eine Template-Spezialisierung, die eine normale C-Style-String akzeptiert. Zum BeispielTemplate-Spezialisierung für C-Style-String

namespace RubyUtils 
{ 
    template<class T> VALUE toValue(const T& v); 
}; 

template<> VALUE toValue(char const* & v) 
{ 
    return toValue<string>(v); 
} 

und dann an der Aufrufstelle

return RubyUtils::toValue("Life the universe and everything"); 

gibt einen Fehler

unresolved external symbol "unsigned long __cdecl RubyUtils::toValue<char const [33]>(char const (&)[33])" 

, wie ich die Spezialisierung strukturieren sollte vorbei in c-Strings zu ermöglichen?

UPDATE: die Vorlage Spezialisierung Fest Vorlage korrekte Syntax> = Vorlage haben <>

+1

Warum sind nicht beide Vorlagen im Namespace? – Jon

Antwort

1

Ich denke, dass das Problem, das Sie stoßen wahrscheinlich auf die Tatsache zurückzuführen ist, dass Sie zwei Vorlagen definiert haben - ein innerhalb des Namespace und eins aus. Der Fehler ist wahrscheinlich auf diese Verwirrung zurückzuführen.

Aber noch wichtiger, als allgemeine Regel, die Sie nicht wollen, um Funktionsvorlagen zu spezialisieren. Template-Spezialisierung für Funktion hat viele funky Regeln, die fast immer dazu führen, dass die falsche Sache aufgerufen wird. Vielmehr verwendet nur reguläre Funktion Überlastung:

namespace RubyUtils 
{ 
    template<class T> VALUE toValue(const T& v); 
    VALUE toValue(char const* v) 
    { 
     return toValue<string>(v); 
    } 
}; 

Die Art und Weise Funktion funktioniert Überlastung, den Aufruf die toValue Funktion mit einem C-String wird die Nicht-Vorlage toValue führen zu erhalten ausgewählt vor der toValue Vorlage, im Wesentlichen das zu tun Spezialisierung für Sie. Im Allgemeinen bevorzugen Sie bei Funktionsvorlagen das Überladen auf Spezialisierung. Es ist nur sicherer.

Verwandte Themen