在这篇文章中,我试图在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)
成员变量不允许是模板.只有成员函数可以是模板.你必须改变封闭的类B:
template <class T>
class B {
std::list<A<T>*> objects;
};
Run Code Online (Sandbox Code Playgroud)