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
相关产品推荐
相关产品推荐

