4

テンプレートは初めてです。関数テンプレート専用のテンプレートを定義しようとしましたが、コンパイラがエラーを返します。これは単純なmax関数であり、テンプレートを練習するためだけに作成されています。コードは次のとおりです。

template <typename TYP1, typename TYP2> TYP1 maximum(TYP1& param1, TYP2& param2)
{
    return (param1 > param2 ? param1 : param2);
}

および特殊機能:

template<> std::string maximum<std::string, std::string>(std::string prm1, std::string prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

std :: stringまたは自分で定義したクラスを含む他のタイプの特殊化を書き込もうとしても、エラーは常に同じです。

"エラーC2912:明示的な特殊化;'std :: string maximum(std :: string、std :: string)'は関数テンプレートの特殊化ではありません..."

IntelliSenseの提案:「関数テンプレートのインスタンスはありません」

これをコンパイルして正しく動作させるには、何を変更する必要がありますか?

前もって感謝します

4

2 に答える 2

10

&弦の前を忘れています。それは参照型を期待します、あなたの「専門」は値型を使用しています。

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)
于 2010-11-20T15:42:08.997 に答える
3

プライマリテンプレートはパラメータを期待TYP1&しているため、これは専門分野ではありません。TYP2&次を使用してコードを修正できます。

template<> std::string maximum<std::string, std::string>(std::string &prm1, std::string &prm2)
{
    std::cout << "Inside specialized functiion\n";
    return (prm1.length() > prm2.length() ? prm1 : prm2);
}

ここでパラメータが参照されていることに注意してください。

于 2010-11-20T15:44:29.873 に答える