You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++无默认构造函数时调用拷贝构造函数编译报错求助

问题原因与解决方案

错误原因

你的Node拷贝构造函数写法触发了编译器对Characters默认构造函数的调用,而Characters类未定义默认构造函数,导致编译失败。

具体来说:

Node (const Node<T> &other) {
    val= other.val;
}

在这个拷贝构造函数中,进入函数体之前,编译器会先默认初始化成员变量val——因为你没有在初始化列表里显式初始化val,所以编译器会尝试调用T(即Characters)的默认构造函数创建val对象,之后才执行函数体内的赋值操作val = other.val。而你的Characters只定义了带参数的构造函数和拷贝构造函数,没有默认构造函数,因此编译器找不到匹配的函数,报错。

解决方案

有两种可行的解决方式,推荐第一种:

方案1:修改Node的拷贝构造函数,使用初始化列表初始化val

把Node的拷贝构造函数改成用初始化列表直接初始化val,这样会调用Characters的拷贝构造函数,而非默认构造函数:

template <typename T>
struct Node {
    T val;
    Node (const T &val) : val(val) {}
    // 用初始化列表初始化val,直接调用T的拷贝构造函数
    Node (const Node<T> &other) : val(other.val) {}
};

这种方式更高效,避免了先默认构造再赋值的额外开销,也是拷贝构造函数的标准写法。

方案2:给Characters添加默认构造函数

取消你注释掉的默认构造函数代码:

Characters() : power(0), name("") {}

这样编译器就能找到默认构造函数来初始化val,之后再执行赋值操作。不过这种方式不如方案1高效。

额外优化

你手动定义的Characters拷贝构造函数可以删除,编译器会自动生成一个默认的拷贝构造函数,足够完成power和name的成员拷贝,功能和你写的完全一致。

内容的提问来源于stack exchange,提问作者JohnZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:52:20