2016-11-11 9 views
0

クラスの型がintの場合はメッセージを表示し、倍の場合はメッセージの1つを表示するメソッドを含む汎用クラスを作成します。C++でのメンバー関数テンプレートの特殊化

template<class T> 
class A { 
public: 
    template <T> void B(); 

}; 

template<class T> 
void A<int>::B{ 
//some code here 
} 

template<class T> 
void A<double>::B{ 
//some code here 
} 

私が得た次のエラー:任意の解決策を事前に

'double': illegal type for non-type template parameter '__formal' 

'A<int>::B': unable to match function definition to an existing declaration 

おかげでここに私のコードです。

+0

あなたのコードは、あなたのエラーが一致していません。 [mcve] – NathanOliver

+2

も提供してください。クラステンプレートと同じテンプレートパラメータ名を関数テンプレートに使用しないでください。 – NathanOliver

+2

'B'もテンプレートにしますか?あなたの説明から、 'B'がクラステンプレート' A'の通常の非テンプレートメンバ関数になるように思えます。 – Angew

答えて

2

物事のカップル:

  • テンプレートすべきBない理由はありません。あなたは専門にしたいA
  • Bです。メソッドはパラメータを受け取ります。 ()
  • テンプレートの特殊化は、常に空のテンプレートパラメータを必要とするメソッドを定義するとき、あなたは括弧を省略<>

コード:

template<class T> 
class A { 
public: 
    void B(); 
}; 

template<> 
void A<int>::B(){ 
    std::cout << "A<int>::B" << std::endl; 
} 

template<> 
void A<double>::B(){ 
    std::cout << "A<double>::B" << std::endl; 
} 

Demo

あなたがB Aを作るために強いと感じた場合一般的に、関数のテンプレートの特殊化は行われません。これは、主に部分的に特殊化することができないためです。ほとんどの場合、オーバーロードを記述することをお勧めします。あなたのケースでは、Bは引数を取らないので、専門化に有利ないくつかの議論があります。

多くの場合、過負荷を利用して目的の機能を選択できるように、ヘルパ関数を組み合わせたタグディスパッチ手法を使用します。ここではあなたのケースのために派遣タグの簡単な例を示します。

template<class T> 
class A { 
public: 
    template<class U> 
    void B() 
    { 
     B(ATag<U>{}); 
    } 

    private: 
    template<class U> 
    struct ATag{}; 

    void B(ATag<int>) 
    { 
     std::cout << "B<int>" << std::endl; 
    } 

    void B(ATag<double>) 
    { 
     std::cout << "B<double>" << std::endl; 
    } 
}; 

tag dispatch demo

+0

ありがとう!プログラムの中に括弧が入っていて、ここにそれらを入れるのを忘れてしまった。すべては今働く –

関連する問題