2017-02-06 3 views
0

私は、特殊なテンプレートクラスのメソッドで使用されるはずの渡された型のメンバーを持つテンプレートクラスを作成しようとしています。このように:C++の特殊なテンプレートクラスのテンプレートクラスメンバーフィールドにアクセスするにはどうすればよいですか?

template <class T> 
class MyTemplateClass 
{ 
public: 
    MyTemplateClass() {} 

    void DoSomething() 
    { 
     DoSomethingWithMember(); 
    } 

    void DoSomethingWithMember() {} 

protected: 
    T m_member; 

}; 

template<> 
class MyTemplateClass<float> 
{ 
public: 
    void DoSomethingWithMember() 
    { 
     printf("Member is %f", m_member); 
    } 
}; 

私のような呼び出し行うことができるよう:

MyTemplateClass<float> obj2 = MyTemplateClass<float>(); 
obj2.DoSomething(); 

特化したテンプレートクラスがコンパイルされませんが、エラーを与える:

"Use of undeclared identifier m_member ".

はのための方法はあります特別なテンプレートクラスを使用して、新しい特別なタイプのコードを複製することなく元のクラスメンバーにアクセスできますか?それとも私がここでやろうとしていることを達成するための他の方法?

+0

は、仮想関数をオーバーライドと同じではありません、あなたが「ドン1つの部分を置き換え、残りのクラスをプライマリテンプレートから「継承」します。クラステンプレートの特殊化は完全なクラスでなければならないので、 'm_member'というメンバを使用する場合は' m_member'というメンバが必要です。 –

答えて

1

また、あなたが1つの方法だけ、のようなものを専門にする:クラステンプレートを専門

template <class T> 
class MyTemplateClass 
{ 
public: 
    MyTemplateClass(T t) : m_member(t) {} 

    void DoSomething() { DoSomethingWithMember(); } 

    void DoSomethingWithMember(); 

protected: 
    T m_member; 

}; 

// **Fully** Specialize DoSomethingWithMember for float. 
template <> 
void MyTemplateClass<float>::DoSomethingWithMember() 
{ 
    std::cout << "Member is " << m_member; 
} 

Demo

+0

すばらしいおかあさん!私はそのような単一の方法を専門にすることが可能であることを知らなかった、これは私の問題を解決する必要があります。 –

1

So that I can make calls like:

MyTemplateClass<float> obj2 = MyTemplateClass<float>(); 
obj2.DoSomething(); 

The specialised template class won't compile, gives the error: "Use of undeclared identifier 'm_member'".

これは、テンプレートの特殊化が汎用クラステンプレートと関係がないためです。専門分野に必要なものはすべて専門分野で実装する必要があります。以下のような:

template<> 
class MyTemplateClass<float> 
{ 
    public: 
     void DoSomething() 
     { 
     DoSomethingWithMember(); 
     } 

     void DoSomethingWithMember() 
     { 
     printf("Member is %f", m_member); 
     } 

     float m_member; 
}; 
+0

答えをありがとう。私はすでにあなたが書いたように浮動小数点型を明示的に宣言しようとしていましたが、うまくいきました。私はこれが実用的ではないと考えていました。なぜなら、多くのメンバフィールドと/専門化する。上記のJarod42で提案されているアプローチは、私の問題を解決するようです。 –

+0

@ CaioSabinoでは、あなたのニーズに最適なアプローチを使用する必要があります。 –

関連する問題