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;
};

第二种选择:

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

该列表只能存储一种类型。模板的不同实例是不同的类型。如果这令人满意,您可以这样做:

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

如果您需要使用不同的类型,也许您可​​以为 ABC 创建一个非模板基类并存储指向它的指针。(即使用接口)

于 2011-02-23T23:53:23.753 回答