C++模板类通过拷贝构造函数初始化时提示无Q::Q()报错如何解决
错误根因
- 类模板
B的构造函数没有使用成员初始化列表初始化成员变量x:当你不在构造函数初始化列表中指定类成员的构造方式时,编译器会自动调用该成员类型的无参默认构造函数完成初始化,之后才会执行构造函数体内的赋值逻辑。你的Q类已经显式定义了带int参数的构造函数和拷贝构造函数,C++规则下编译器不会再自动生成无参默认构造函数,因此触发找不到Q::Q()的报错。 - 原代码存在多处语法问题:
B类构造函数的闭合大括号被写在单行注释后面,被注释吞掉导致构造函数不完整Q类、B类的定义结束后缺少必备的尾部分号Q类的赋值运算符重载没有返回*this,不符合语法要求
修复方案
方案1(推荐):修改B类构造函数,使用初始化列表初始化成员
不需要修改Q类,直接通过初始化列表用传入的参数直接拷贝构造x,从根源上避免调用无参构造:
template <class T> class B{ public: T x; // 初始化列表直接用t拷贝构造x B<T>(T t) : x(t) { // 不需要再在函数体内给x赋值 } }; // 类定义末尾必须加分号
方案2:给Q类补充无参默认构造函数
如果你确实需要在B的构造函数体内完成赋值操作,可以给Q显式添加无参构造:
class Q { public: Q() = default; // 显式声明无参默认构造,也可以自己实现函数逻辑 Q(int) {} // 原有int参数构造 Q(const Q &obj) {} // 原有拷贝构造 Q& operator= (const Q& a) { // 赋值逻辑 return *this; // 必须返回当前对象引用 } }; // 类定义末尾必须加分号
修改后B <Q> aa(a);这行代码即可正常编译,会调用Q的拷贝构造函数完成B::x的初始化。
内容的提问来源于stack exchange,提问作者elections 12
相关产品推荐
相关产品推荐

