C++ 为什么在派生类中删除默认构造函数? 模板 福班 { T-tVar; 公众: Foo(T):tVar(T){ }; 类FooDerived:public Foo{}; int main() { 食物; 返回0; }
这使得: 错误(活动)E1790无法引用“FooDerived”的默认构造函数--它是已删除的函数cpp89 d:\Dokumentumok2\Visual Studio 2017\Projects\cpp89\cpp89\cpp89.cpp 20 如果我将默认构造函数添加到类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 {
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>() {}
};