意味に応じて、タイプまたはを除外しますstring
char
。リンクしないようにする場合は、タイプの特殊化を宣言することはできますが、定義することはできません。
template <>
void parse<std::string>( std::string & value, const std::string& token );
コンパイラーは特殊化を認識し、コードを生成しません。シンボルがどの変換ユニットでも定義されていないため、リンカは失敗します。
2番目のアプローチは、もう少し複雑ですが、リンク時に失敗するのではなく、コンパイラーがこれらのタイプのテンプレートを受け入れないようにすることです。これは、C ++ 11でより単純なSFINAEを使用して実行できますが、C ++ 03ソリューションが必要な場合は、グーグルで検索するか、コメントを追加できます。
template <typename T,
typename = typename std::enable_if<!std::is_same<T,std::string>
&& !std::is_same<T,char>>::type >
void parse( T & t, const std::string& token ) {
// ...
}
(私はこれをコンパイラーで実行していないので、構文が少しずれている可能性があります。それで遊んでください)コンパイラーはテンプレートを認識し、型の置換を実行しようとすると、に解決されないT
ために失敗します。std::enable_if<...>::type
タイプ。
一般に、おそらく必要なのは、の特定のバージョンを実行し、parse
優先するさまざまなオーバーロードを提供することです。
void parse( std::string& v, const std::string& token ) {
v = token;
}
これはテンプレートではなく、通常の関数であることに注意してください。テンプレート化されていない関数は、呼び出しの引数が完全に一致する場合、テンプレート化された関数よりも適切に一致します。