C++ Complexno类运算符重载报一元表达式参数类型无效错误
错误原因
你当前代码只实现了二元版本的operator-(需要两个Complexno操作数,对应a - b的写法),完全没有定义一元operator-(仅需要一个右操作数,对应-n1的写法),编译器遇到-n1时找不到匹配的运算符重载,因此抛出参数类型无效的错误。
你写的negate()是普通成员函数,只能通过n1.negate()的形式调用,无法直接适配-前缀的运算符语法。
除此之外你的代码还有3个隐藏问题,后续编译运行也会触发错误:
operator<<的第二个参数是非常量左值引用,无法绑定运算产生的临时Complexno对象,输出表达式结果时会编译失败- 复数除法的虚部计算公式写错,运行时计算结果错误
- 没有实现需求里提到的一元
+运算符
修复方案
第一步:修改头文件声明
在类的友元声明区补充一元运算符声明,同时修正operator<<的参数常量性,建议所有二元运算符参数改用const引用减少不必要的拷贝:
// 替换原有友元声明块 friend Complexno operator+(const Complexno&,const Complexno&); friend Complexno operator*(const Complexno&,const Complexno&); friend Complexno operator-(const Complexno&,const Complexno&); // 二元减法 friend Complexno operator/(const Complexno&,const Complexno&); friend Complexno operator-(const Complexno&); // 新增:一元负号 friend Complexno operator+(const Complexno&); // 新增:一元正号 friend ostream& operator<<(ostream &,const Complexno &); // 新增const,支持临时对象
第二步:补充实现、修正现有bug
在类实现的cpp文件中添加一元运算符的实现,同时修复除法、<<运算符的问题:
- 新增一元-、一元+的实现:
// 一元负号:返回实部虚部都取反的新复数 Complexno operator-(const Complexno& num) { return Complexno(-num.real, -num.complex); } // 一元正号:直接返回原复数即可 Complexno operator+(const Complexno& num) { return num; }
- 修正
operator<<的参数定义,和头文件声明保持一致,给第二个参数加const:
ostream& operator<<(ostream &out,const Complexno &C) { out<<"("; out<<C.real; out<<"+"; out<<C.complex<<"i)"; return out; }
- 修正除法运算符的虚部计算逻辑,原公式写错了,替换为正确实现:
Complexno operator/(const Complexno& num1,const Complexno& num2) { double denom = num2.real * num2.real + num2.complex * num2.complex; Complexno answer; answer.real = (num1.real * num2.real + num1.complex * num2.complex)/denom; // 原虚部公式错误,修正为下式 answer.complex = (num1.complex * num2.real - num1.real * num2.complex)/denom; return answer; }
- 其余二元+、二元-、二元*运算符的参数也可以同步改成
const Complexno&形式,函数内部逻辑不需要改动,能减少值传递的拷贝开销。
改完之后n3 = -n1;语句即可正常编译,所有要求重载的运算符都可以正常工作。
内容的提问来源于stack exchange,提问作者Gab
相关产品推荐
相关产品推荐

