10

クラス テンプレートを持つ ABC という名前のクラスがあります。

template <class T> class ABC{}

別のクラスでは、オブジェクト ABC をリストに格納しようとしています:

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

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

4

3 に答える 3

10

コンパイル時にポインタに対してもテンプレートを指定する必要がありますか?

はい。

コンテナが異なるタイプのオブジェクトを格納することになっている場合はどうなりますか? それは不可能ですか?

(直接)不可能です。

クラスABCのようなものはありません。や などの ABC のインスタンス化のみがありABC<Foo>ますABC<Bar>。これらは完全に異なるクラスです。

次のようなことができます:

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

list<ABC_Base*> some_list;

これにより、すべての ABC インスタンス化に共通の基本型があり、任意に基本ポインターを使用できます。

于 2011-02-23T23:53:03.957 に答える
1

CDEクラスでテンプレート パラメーターを指定するか、テンプレートも作成する必要がありますCDE

最初のオプション:

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

2 番目のオプション:

template <class T>
class CDE {
private:
    list< ABC<T>* > some_list;
};
于 2011-02-23T23:51:49.713 に答える
1

リストには 1 つの型しか格納できません。テンプレートのさまざまなインスタンス化は、さまざまなタイプです。これで問題がなければ、次のようにできます。

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

異なる型を使用する必要がある場合は、おそらく ABC の非テンプレート基本クラスを作成し、それへのポインターを格納できます。(つまり、インターフェースを使用する)

于 2011-02-23T23:53:23.753 に答える