2011-04-10 20 views
1

私が他の目的によってテンプレートを持つクラスがあります。C++テンプレートの問題

template<class t> 
class MyClass { 
    public: //of course public... 
    t foo; 
    std::string text; 
} 

を、私はメソッドに引数を介してこれらのクラスのすべての種類を取得別のクラスを持っている、とにポインタを格納したいですアレイ。クラスは、クラスの特定の(弱体化した)部分に共通の属性/メソッドのみにアクセスしたくありません。ここ

class Container { 
    public: //of course public... 
    MyClass* array; //this is allocated with some magic. 
    void bar(MyClass& m) { 
     and want to store the class in a MyClass* array. 
    } 
} 

は、テンプレートの引数リストが

が欠落していること、エラーがどのように私はこの問題を解決することができますか?

答えて

5

最も簡単な方法は、同様にその機能にテンプレートを作成することです:

template <class t> 
void bar(MyClass<t>& m) { 
    // ... 
} 

注意あなたがそれを変更する必要はありませんので、それはおそらく、const MyClass<t>&でなければならないこと。


新しいコードは無意味です。タイプMyClassのオブジェクトとしてMyClassテンプレートであるため、このようなことはありません。あなたは関係なく、自分のテンプレート引数のこれらのクラスを操作する場合は、基本クラスとして非テンプレート部分を考慮する必要があります。

class MyClassBase 
{ 
public: 
    // polymorphic base classes should always have virtual destructors 
    ~MyClassBase() {} 

    virtual void some_function() = 0; 
}; 

template <typename T> 
class MyClass : public MyClassBase 
{ 
public: 
    // implement abstract functions 
    void some_function() 
    { 
     // template argument T is available here 
    } 
}; 

次に、あなたがそのベースを参照することができ、そしてときに呼び出します仮想関数は、動的にディスパッチします:

class Container 
{ 
public: 
    // no magic: use a std::vector for dynamic arrays 
    std::vector<MyClassBase*> array; // not by value! avoid slicing 

    void bar(MyClassBase& m) 
    { 
     array.push_back(&m); 
    } 

    void baz() 
    { 
     array[0]->some_function(); // for example 
    } 
}; 
+0

コンパイラからあなたに伝えられるように、テンプレート引数を 'MyClass'に渡す必要があります**。 –

+0

申し訳ありませんが、別のクラスメソッドがMyClass属性にアクセスする必要があるため、これは実際には正しくありません。これは私が言ったことの間違いです。私は2番目に私のqを更新する –

+0

ありがとう。本当に素敵な答え –

0

あなたバー機能は、あなたがしたい場合は、合法的にその

+0

良い見解が、私はそれが誤字だと推測できると思います。 :) – GManNickG

+0

これはエラーメッセージの原因ではありません。 –

1

と同じように使用することはできませんクラスのメソッドである場合を除き、あなたのクラスのテキストの変数はとてもプライベートで"マルチテンプレート"配列を作成すると、テンプレート以外のcla ssはテンプレートクラスの基本クラスです。または、テンプレート配列を作成してその中にオブジェクトを格納することもできます。

3

共通の基本クラスを入れてみましょう。

class MyClassCommon { 
protected: 
    ~MyClassCommon() { } 

public: 
    std::string text; 
}; 

template<class t> 
class MyClass : public MyClassCommon { 
public: // of course public... 
    t foo; 
}; 

class Container { 
public: // of course public... 
    MyClassCommon* array; // this is allocated with some magic. 
    void bar(MyClassCommon& m) { 
     /* ... */ 
    } 
}; 
+0

あなたがこれを追加したのを見たことがなかった、あなたのつま先を踏み出すことを意味しなかった。 – GManNickG

+1

@GMan大丈夫です。私は傷ついたり何もしていません。乾杯:) –

+0

あなたの答えにも感謝します。私はこの素晴らしい答えのためにあなたをupvoted、しかし、私はGManの答えをより理解する。 –

関連する問題