使用抽象类的子类专门化模板

时间:2014-12-19 13:56:30

标签: c++ templates abstract-class subclass

我遇到了以下问题:

我的课程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;
}

2 个答案:

答案 0 :(得分:7)

无法实例化包含纯虚拟成员函数的类。由于您未在_nothing中指定SubDummy的覆盖,因此在此类中它也是纯虚拟的。您必须在_nothing中实施SubDummy才能使其有效。

答案 1 :(得分:3)

有时,在调试模板时,考虑使用变量实例化类时会有什么用处。

    class TestWithSubDummy {
       public:
           TestWithSubDummy() {
                 SubDummy t;//the error
            }
     };

你很明显试图在错误中实例化SubDummy(使用默认构造函数)。但是SubDummy是抽象的,所以我们不允许实例化它。因此,错误。