0

通常の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スタイルの文字列を渡すことができるように特殊化をどのように構成する必要がありますか?

更新:正しい構文template =>template<>を持つようにテンプレートの特殊化を修正しました

4

1 に答える 1

1

あなたが遭遇している問題はおそらく、名前空間の内側と外側の 2 つのテンプレートを定義したという事実に関連していると思います。エラーは、この混乱が原因である可能性があります。

しかし、もっと重要なことは、一般的な規則として、関数テンプレートを特殊化したくないということです。関数のテンプレートの特殊化には、それに関連付けられた多くのファンキーなルールがあり、ほとんどの場合、間違ったものが呼び出されます。むしろ、通常の関数のオーバーロードを使用してください。

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

関数のオーバーロードが機能する方法、つまりtoValueC スタイルの文字列で関数を呼び出すと、非テンプレートtoValueがテンプレートの前に選択されtoValue、本質的に特殊化が行われます。より一般的には、関数テンプレートでは、特殊化よりもオーバーロードの使用を好みます。より安全です。

于 2011-01-09T23:23:23.010 に答える