C++ 为什么在派生类中删除默认构造函数? 模板 福班 { T-tVar; 公众: Foo(T):tVar(T){ }; 类FooDerived:public Foo{}; int main() { 食物; 返回0; }

C++ 为什么在派生类中删除默认构造函数? 模板 福班 { T-tVar; 公众: Foo(T):tVar(T){ }; 类FooDerived:public Foo{}; int main() { 食物; 返回0; },c++,C++,这使得: 错误(活动)E1790无法引用“FooDerived”的默认构造函数--它是已删除的函数cpp89 d:\Dokumentumok2\Visual Studio 2017\Projects\cpp89\cpp89\cpp89.cpp 20 如果我将默认构造函数添加到类Foo,它就会编译。有人能解释一下吗?这是一个面试测试中的问题。谢谢。工作示例。 一旦声明接受参数的Foo构造函数,那么默认的空构造函数将被删除 template<typename T> class Foo {

这使得:

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

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

工作示例。 一旦声明接受参数的Foo构造函数,那么默认的空构造函数将被删除

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;
}
模板
福班
{
T-tVar;
公众:
Foo(T):tVar(T){
};
类Foo派生:public Foo{
公众:
foooderived():Foo(“”{}
};
int main()
{
食物;
返回0;
}

当您不声明任何构造函数时,编译器会使用
public
访问权限为您隐式声明一个默认构造函数,除非其格式不正确

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

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;
}
classfooderived:publicfoo{};
相当于:

class FooDerived : public Foo<std::string> {};
类Foo派生:公共Foo
{
公众:
foooderived():Foo(){}
};

正如您所看到的,这是一个问题,因为
Foo
没有默认构造函数。

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

除非指定,否则派生类将调用基类的默认构造函数(不带参数的构造函数)


因此,您看到了错误。

当您不传递参数表时,默认构造函数应该如何构造
Foo
?当运行该代码时,您希望Foo::tVar的值是多少?如果您需要,您可以使用
=default
返回默认的构造函数(并且您知道它会为您的目的工作)。
class FooDerived : public Foo<std::string>
{
   public:
      FooDerived() : Foo<std::string>() {}
};