2017-10-31 11 views
-2

私はテンプレートプログラミングについてはかなり新しいですし、関連する質問を見つけることができませんでした。呼び出すクラスのメソッドinstideテンプレートクラス

私はその後、私は私がバー()メソッドを呼び出すことができますどのように

変数

MyTemplate<Foo> var; 
を宣言

template<class T> 
    class MyTemplate 
    { 
     public: 
     virtual void set(const T& val) { value_ = val; } 
     virtual T get() const { return value_; } 
     // other stuff 


     private: 
     T value_; 
    } 

とカスタムクラス

class Foo 
{ 
    void bar(); 
} 

私のテンプレートクラスを持っていますvar

+0

テンプレートクラスで 'T'(resp。' Foo')をどのように表現しますか? – user0042

+0

'bar()'は 'MyTemplate'のメンバーではありません。あなたは' var.bar() 'を実行できません。 – DimChtz

+0

' MyTemplate'では何をしていますか?あなたが何をするかによって、その答えは非常に異なってくるかもしれません。 –

答えて

1

bar()を呼び出すには、Fooのインスタンスがどこかに必要です。すでに述べたように、継承を使うことができます。そのようなメンバーを追加するために質問が編集されているのがわかります。テンプレートタイプのメンバーを直接呼び出すことはできません。たとえば、 'doBar()'のように、MyTemplateにラッパーを追加することができます。また、(それは良い考えではありませんが)Fooのメンバーを公開することで公開することもできます。

#include <iostream> 

template<class T> 
class MyTemplate 
{ 
public: 
    void doBar() { value_.bar(); } 
public: 
    T value_; 
}; 

class Foo 
{ 
public: 
    void bar(); 
}; 

void Foo::bar() 
{ 
    std::cout << "Foo::bar()\n"; 
} 

int main() 
{ 
    MyTemplate<Foo> var; 
    var.doBar(); 
    var.value_.bar(); 
} 

はところで、他の古いタイマーは博士ドブスジャーナルにSwaine's Flamesを思い出し?

+0

ありがとうございます。 T * instance(){return&value}のような内部変数のポインタを返すメソッドを追加すると、それを実行できるはずですが、それは悪い習慣ですか? – Moia

+0

@Moiaその時点で、 'value'を' MyTemplate'のパブリックメンバにし、仮想 'get'tersと' set'terを避けるほうがはるかに良いでしょう。とにかくやってみるべきです。 –

+0

@Moia一般的に私はクラスの内部を公開することを勧めます。 –

関連する問題