3

これは誰かが以前に尋ねた質問かもしれませんが、私はそれを見つけることができません...

ファイルにクラスがあり.hppます:

class A{
    public:
        A(){//constructor}
        ~A(){//destructor}
        //some public methods and arguments

        template<typename Type>
            void func(Type t){//do something for numbers}

    private:
        //some private methods and arguments
}

テンプレート メソッドは、int、double では機能するはずですが、string では機能しません。したがって、私のファイルでは、数字に対して.hpp何をするかを定義し、私のファイルでは次のように書きました。func.cpp

template<>
void A::func(std::string t){ // do something in that case}

しかし、関数funcをで使用するとstd::string、プログラムは数値のメソッドを呼び出します...そのため、.hppファイルを次のように置き換えました。

class A{
    public:
        A(){//constructor}
        ~A(){//destructor}
        //some public methods and arguments

        template<typename Type>
            void func(Type t){//do something for numbers}
        void func(std::string s);

    private:
        //some private methods and arguments
}

そして私の.cppファイルは次のようになりました:

void A::func(std::string t){ // do something in that case}

そして、すべてが機能します!

私の質問は、これは正しい方法ですか?

4

2 に答える 2

3

これは部分的な特殊化ではなく (特殊化されていないテンプレート パラメーターはありません)、明示的な特殊化です。

テンプレートは、それらを使用するコードから見える必要があります。ヘッダー ファイルで特殊化を宣言しない場合、a を使用して呼び出そうとするコードはA::funcstringプライマリ テンプレート (数字用のテンプレート) をインスタンス化し、それを使用します。 `string の特殊化が存在することすら知りません。

.cppしたがって、ファイルの外で使用できるようにするには、(少なくとも) ヘッダーで特殊化を宣言する必要があります。

template<>
void A::func(std::string t);

ただし、オーバーロードを使用する代替手段はより単純であり、完全に受け入れられます。ヘッダーでオーバーロードstringが宣言されているため機能するため、それを呼び出すコードは呼び出す関数を認識します。

于 2013-07-09T11:44:12.977 に答える
0

オーバーロードは、多くの目的に適したアプローチです。ただし、専門化を追加すると、元のテンプレート アプローチも機能する可能性があると思いますconst char *。そうすれば、数値バージョンに解決せずに文字列リテラルを渡すことができます。

于 2013-07-09T11:55:17.557 に答える