我想知道是否能得到正确答案的一个基本问题是:
为什么情况1不起作用,但情况2起作用? (假设在main()中,我们编写了Boo<int> b;
案例1
template <typename T>
class Boo
{
public:
Boo();
private:
};
案例2
template <typename T>
class Boo
{
public:
Boo() = default;
private:
};
我认为原因情况1 不起作用的原因是,编译器发现我们声明了一个ctor,因此它不再生成合成的ctor。当我们声明一个类对象时,编译器找不到所需的默认ctor的定义,因此这是编译错误。
情况2 起作用的原因是因为= default
明确允许编译器为我们生成默认的ctor。
我的推理正确吗?
答案 0 :(得分:2)
我假设您在情况1中收到未定义的引用链接器错误。其“不起作用”的原因仅是因为您已声明构造函数Boo()
但未定义它。如果在情况1中您编写了Boo() {}
(用空主体定义了构造函数),则链接程序将不会抱怨。
答案 1 :(得分:2)
我认为案例1不起作用的原因是因为编译器看到我们声明了一个ctor,所以它不再生成合成的ctor。
部分正确。它不会生成默认构造函数,但仍会生成副本构造函数。
当我们声明一个类对象时,编译器找不到所需的默认ctor的定义,因此这是编译错误。
那将是链接器错误,而不是编译器错误。
您可以通过定义构造函数轻松解决它。
template <typename T>
class Boo
{
public:
Boo() {}
private:
};