我有一个名为ABC的类,它有一个类模板:
template <class T> class ABC{}
在另一个类中,我试图将对象ABC存储在列表中:
class CDE{
private:
list<ABC *> some_list;
}
我打算存储可能具有不同类模板参数的ABC对象。是否有必要在编译时为指针指定模板?如果容器应该存储不同类型的对象怎么办?这不可能吗?
答案 0 :(得分:7)
是否有必要在编译时为指针指定模板?
是
如果容器应该存储不同类型的对象怎么办?这不可能吗?
(直接)不可能。
没有类ABC这样的东西。只有ABC的实例化,例如ABC<Foo>
和ABC<Bar>
。这些是完全不同的类。
您可以执行以下操作:
template<typename T>
class ABC : public ABC_Base
{
...
}
list<ABC_Base*> some_list;
通过执行此操作,所有ABC实例都具有公共基本类型,您可以任意使用基本指针。
答案 1 :(得分:1)
您需要在CDE
课程中指定模板参数,或者使CDE
成为模板。
第一个选项:
class CDE {
private:
list< ABC<int>* > some_list;
};
第二个选项:
template <class T>
class CDE {
private:
list< ABC<T>* > some_list;
};
答案 2 :(得分:1)
该列表只能存储一种类型。模板的不同实例是不同的类型。如果这是令人满意的,你可以这样做:
template <class T> class CDE{ private: list<ABC<T> *> some_list; }
如果你需要使用不同的类型,也许你可以为ABC创建一个非模板基类并存储指向它的指针。 (即使用界面)