【发布时间】:2015-01-15 21:06:32
【问题描述】:
我正在尝试制作一个模板对象列表,这些模板对象是在基类的不同子类之后模板化的。我知道列表不可能是异构的,所以在这些基类列表之后对我的模板列表进行类型定义。
检查下面的基本代码。当我尝试从模板中实例化实现时,问题就出现了,因为它仍然假设我使用的是抽象基类,即使我已经在模板参数中传递了它的子类。
这一切都在标题中完成。
// Base Class
class MyBase {
public:
MyBase(int a) {}
virtual void Print() = 0;
};
// Subclass ONE
class MySub_One :
public MyBase
{
public:
MySub_One(int a)
: MyBase(a) {}
virtual void Print() override { printf("Sub One\n"); }
};
// Subclass TWO
class MySub_Two :
public MyBase
{
public:
MySub_Two(int a)
: MyBase(a) {}
virtual void Print() override { printf("Sub Two\n"); }
};
// Template Class
template <class T>
class MyTemplate
{
int numPrint;
void CreateAndPrint()
{
T* obj = new T(0); // Compiler says, "error C2259: 'MyBase' Cannot instantiate abstract class."
obj = dynamic_cast<MyBase>( obj );
obj->Print();
}
};
当我稍后将一个子类对象添加到一个基类列表中时,还有一个问题:
list<MyTemplate<MyBase>*> testList = list<MyTemplate<MyBase>*>();
testList.push_back( new MyTemplate<MySub_One>() ); // This is a problem too
是什么导致了这两个错误?有什么办法可以做到吗?
【问题讨论】:
标签: c++ templates visual-c++ c++11