我遇到了以下问题:
我的课程Test
包含模板T
。当我创建这个类的对象,专门研究其他常见类时,一切正常。在类Test
的构造函数中,有一行代码可以创建模板类的对象;
但是当我尝试实例化这个类(Test
)时,将它与抽象类(SubDummy
)的子类(Dummy
)一起专门化,我得到一个错误:无法实例化一个抽象类。
示例代码(简化为本文的目的):
class Dummy
{
private:
virtual void _nothing() = 0; // this makes the class abstract
};
class SubDummy : public Dummy
{
public:
SubDummy() :
Dummy()
{
}
};
template <class T>
class Test
{
public:
Test()
{
T t; // here the compiler reports the error
}
};
int main()
{
Test<SubDummy> x;
}
答案 0 :(得分:7)
无法实例化包含纯虚拟成员函数的类。由于您未在_nothing
中指定SubDummy
的覆盖,因此在此类中它也是纯虚拟的。您必须在_nothing
中实施SubDummy
才能使其有效。
答案 1 :(得分:3)
有时,在调试模板时,考虑使用变量实例化类时会有什么用处。
class TestWithSubDummy {
public:
TestWithSubDummy() {
SubDummy t;//the error
}
};
你很明显试图在错误中实例化SubDummy
(使用默认构造函数)。但是SubDummy
是抽象的,所以我们不允许实例化它。因此,错误。