C++は

2011-02-23 1 views
7

は、私はクラステンプレートを持つABCという名前のクラスを持つオブジェクト私は異なるクラスのテンプレートパラメータを持つかもしれないABCのオブジェクトを格納するつもりです。コンパイル時にポインタの場合でもテンプレートを指定する必要はありますか?コンテナが異なるタイプのオブジェクトを格納すると思われる場合はどうなりますか?それは不可能ですか?C++は

答えて

7

それも、コンパイル時にポインタのためのテンプレートを指定する必要ですか?

はい。

異なるタイプのオブジェクトを格納すると想定される場合はどうなりますか?それは不可能ですか?

(直接)可能ではありません。

クラスABCのようなものはありません。 ABC<Foo>ABC<Bar>のようなABCのインスタンシエーションだけがあります。これらは全く異なるクラスです。

あなたが何かを行うことができます。これにより

template<typename T> 
class ABC : public ABC_Base 
{ 
    ... 
} 

list<ABC_Base*> some_list; 

を、あなたのABCのインスタンス化の全ては、共通の基本型を持っていて、任意にベースポインタを使用することができます。

+0

これはちょっと不利な点がありますが、これは妥当なようです。テンプレートを使用する理由のすべては、オブジェクトが密接に結合されていることを確認することでした。このようにして、テンプレートタイプなしでABC_Base(またはその派生クラス)のオブジェクトを作成し、それらをリストで使用する機会がまだあります。 – cyrux

+4

@cyrux 'ABC_Base'を抽象化すると、誰も' ABC_Base'のオブジェクトを作成することができません。 – user470379

1

CDEクラスにテンプレートパラメータを指定するか、テンプレートとしてCDEをテンプレートにする必要があります。

最初のオプション:

class CDE { 
private: 
    list< ABC<int>* > some_list; 
}; 

番目のオプション:

template <class T> 
class CDE { 
private: 
    list< ABC<T>* > some_list; 
}; 
1

リストには1つのタイプしか格納できません。テンプレートの異なるインスタンス化は、異なるタイプです。これは満足のいくものであるならば、あなたはこのようにそれを行うことができます。

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

あなたは、異なるタイプを使用する必要がある場合は、おそらくあなたはそれにABCと店舗ポインタのための非テンプレート基本クラスを作成することができます。 (つまり、インタフェースを使用してください)