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
添加默认构造函数,它就会编译。有人可以解释一下吗?这是面试中的一个问题。谢谢。
答案 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中添加了参数化构造函数,因此编译器不会提供默认构造函数。
除非指定,派生类将调用基类的默认构造函数(没有参数的构造函数)。
因此,您会看到错误。