为什么在派生类中删除了默认构造函数?

时间:2018-04-09 17:28:46

标签: c++

template<typename T>
class Foo
{
    T tVar;
public:
    Foo(T t) : tVar(t) {}
};

class FooDerived : public Foo<std::string> {};

int main()
{
    FooDerived d;
    return 0;
}

这给出了:

  

错误(活动)E1790“FooDerived”的默认构造函数无法引用 - 它是已删除的函数cpp89 d:\ Dokumentumok2 \ Visual Studio 2017 \ Projects \ cpp89 \ cpp89 \ cpp89.cpp 20

如果我向类Foo添加默认构造函数,它就会编译。有人可以解释一下吗?这是面试中的一个问题。谢谢。

3 个答案:

答案 0 :(得分:3)

当你没有声明任何构造函数时,编译器会隐式声明一个具有public访问权限的默认构造函数,除非它的格式不正确。

此外,当您显式声明任何构造函数时,将隐式删除默认构造函数。

class FooDerived : public Foo<std::string> {};

相当于:

class FooDerived : public Foo<std::string>
{
   public:
      FooDerived() : Foo<std::string>() {}
};

如您所见,这是一个问题,因为Foo<std::string>没有默认构造函数。

答案 1 :(得分:0)

工作实例。 一旦声明了接受参数的Foo构造函数,就会删除默认的空构造函数。

template<typename T>
class Foo
{
    T tVar;
public:
    Foo(T t) : tVar(t) {}
};

class FooDerived : public Foo<std::string> {
public:
    FooDerived():Foo<std::string>(""){}
};

int main()
{
    FooDerived d;
    return 0;
}

答案 2 :(得分:0)

您在Foo类中没有任何默认构造函数。由于您在Foo中添加了参数化构造函数,因此编译器不会提供默认构造函数。

除非指定,派生类将调用基类的默认构造函数(没有参数的构造函数)。

因此,您会看到错误。