如何声明作为类中任何类型的对象的数据成员

dph*_*ham 13 c++ templates

在这篇文章中,我试图在B类中声明一个列表,该列表可以保存任何类型的A类对象,例如A <int>,A <double>,A <float>.我打算在运行时将A对象添加到列表中:

#include <list>

template <class T> class A {};

class B {
    template<class T> std::list<A<T>*> objects;
};
Run Code Online (Sandbox Code Playgroud)

看起来像这样的列表应该工作,但编译它会给出一个错误:

第6行:错误:数据成员'对象'不能是成员模板

由于-Wfatal-errors导致编译终止.

有人可以解释为什么这不起作用以及我如何解决它?

Xeo*_*Xeo 14

这不是C++的工作原理.如果要将不同的对象组合在一起,则需要至少具有某种关系.作为同一类模板的实例化并不意味着它们是相关的,它们是完全不同的类型.如果你想要一个A<T>*s 列表,最好通过虚函数制作一个基类指针列表和转发操作:

class A_base{
public:
  virtual void foo() = 0;
  virtual ~A_base() { }
};

template<class T>
class A : public A_base{
public:
  void foo(){
    // ...
  }
};

class B{
  std::list<A_base*> objects;
};
Run Code Online (Sandbox Code Playgroud)

  • 可能更好地使用智能指针列表或Boost ptr_list,但+1.没有Boost.Any,这是最接近异构容器的C++. (2认同)

Rob*_*edy 5

成员变量不允许是模板.只有成员函数可以是模板.你必须改变封闭的类B:

template <class T>
class B {
  std::list<A<T>*> objects;
};
Run Code Online (Sandbox Code Playgroud)