gpt4 book ai didi

c++ - 继承类模板的参数化构造函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:25:00 25 4
gpt4 key购买 nike

我有多个继承类,但出现错误 C2<int (__cdecl *)(int)>': no appropriate default constructor available , 但我为 C1,C2 定义了参数化构造函数.

一个相关的问题是我看到了标记为 ??? 的注释行在一些代码中。这是什么意思 - 它正在为 C2 初始化默认构造函数来自 C3

#include <iostream>
int y(int)
{ int a=1; return a }

template<typename F>
class C1
{
public:
F f1;
C1(F g) : f1(g) {}
};

template<typename F>
class C2 : public C1<F>
{
public:
F f2;
C2(F g) : f2(g) {}
};

template<typename F>
class C3 : public C2<F>
{
public:
F f3;
C3(F g) : f3(g) {}
//C3 (F g) : C2<F>(g) {} ???
};


int main()
{
C1 o1(y);
C2 o2(y);
C3 o3(y);
}

最佳答案

当您构造另一个类的子类时,将调用父类的默认构造函数(除非像在标记为 ??? 的行中显式调用另一个构造函数)。但是看到你为每个类提供了一个构造函数,编译器没有生成隐式默认构造函数。因此,当您创建 C2 的实例时,编译器会尝试调用 C1 缺少的默认构造函数,但无法找到它。

如果你确实提供了一个默认的构造函数,这是可行的:

#include <iostream>
int y(int) {
int a=1;
return a;
}

template<typename F>
class C1 {
public:
F f1{};

C1() = default;

C1(F g)
: f1(g)
{ }
};

template<typename F>
class C2 : public C1<F>
{
public:
F f2{};

C2() = default;

C2(F g)
: f2(g)
{ }
};

template<typename F>
class C3 : public C2<F>
{
public:
F f3{};

C3() = default;

C3(F g)
: f3(g)
{ }
//C3 (F g) : C2<F>(g) {} ???
};


int main()
{
C1 o1(y);
C2 o2(y);
C3 o3(y);
}

标记为 ??? 的行调用特定的父构造函数,而不是依赖于对父类默认构造函数的隐式调用。

因此,您既可以像上面那样提供默认构造函数,也可以采用 ??? 行语法来调用特定的构造函数——这取决于您的类设计和意图。

关于c++ - 继承类模板的参数化构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com