2011-01-09 25 views
0

通常のCスタイルの文字列を受け入れるテンプレートの特殊化の正しい構文を取得するのが難しいです。例Cスタイルの文字列のテンプレートの特殊化

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

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

については、その後、呼び出しサイトで

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

がエラーに

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

を与えるどのように私はCスタイルの文字列を渡す可能にするための特殊化を構造化する必要がありますか?

UPDATE:は正しい構文テンプレート=>テンプレートを持つようにテンプレートの特殊化を修正<>

+1

名前空間に両方のテンプレートが存在しないのはなぜですか? – Jon

答えて

1

私はあなたが直面している問題は、おそらくあなたは2つのテンプレート定義されてきたという事実に関係していると思います - 1を名前空間の内側と外側に1つ。このエラーはおそらくこの混乱によるものです。

さらに重要なのは、一般的なルールとして、ではないことです。は、機能テンプレートを特化したいと考えています。関数のテンプレートの特殊化には、それに関連するたくさんのファンキーなルールがあり、ほぼ普遍的に間違ったものが呼び出されます。むしろ、普通の関数のオーバーロードを使用します。

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

一方向関数は、基本的にやって、非テンプレートtoValueが先toValueテンプレートの選択を取得するようになりますCスタイルの文字列でtoValue関数を呼び出し、作品への過負荷あなたのための専門化。より一般的には、関数テンプレートでは、特殊化のためにオーバーロードを使用することをお勧めします。それだけで安全です。