【发布时间】:2026-01-28 10:30:01
【问题描述】:
我在complex.h中创建了一个complex结构并重载了一系列运算符(包括^)来处理complex+double、double+double、complex+complex、double+complex这四个操作:
complex operator^(complex& lhs, complex& rhs){
double new_mag = std::pow(mag(lhs), rhs.re);
double new_arg = angle(lhs.re, lhs.im) * rhs.re;
return complex(new_mag * std::cos(new_arg), new_mag * std::sin(new_arg));
}
然后我在文件calc.cpp中定义了两个结构体,其中包括complex.h,即op和func:
struct op{
char symbol;
uint8_t precedence;
uint8_t assoc;
uint8_t type;
std::function<complex (complex, complex)> operate;
};
struct func{
std::string symbol;
uint8_t type;
std::function<complex (complex, complex)> operate;
};
每个结构还定义了一个函数。然后我尝试在同一个文件中初始化这些结构的对象:
op op6{'^', 4, RIGHT, BINARY, [] (complex a, complex b){return b ^ a;}}; // no errors
// no operator "^" matches these operands -- operand types are: complex ^ complex
func f10{"sqrt", ONE_INPUT, [] (complex a, complex b){return a ^ complex(1/2);}};
我还尝试将complex(1/2) 保留为双精度.5,但这给了我同样的错误,除了操作数类型complex ^ double。
我的问题是运算符^ 怎么能不匹配complex 类型的操作数,当它被定义为这样做时,并且在op6 的初始化中这样做?
【问题讨论】:
-
complex (complex, complex)不匹配complex operator^(complex& lhs, complex& rhs)。你看出区别了吗? -
请注意,您可能需要
complex operator^(const complex& lhs, complex& rhs)。您无需修改lhs或rhs,这将允许您将临时变量或隐式转换为complex的内容传递给您的函数。 -
另外,它应该是
complex operator^(const complex& lhs, const complex& rhs)使其能够接受临时的。 -
仅供参考,您不能重载
double+double的运算符,因为double是该语言的基本类型,并且它的运算符都是该语言的内置类型。您只能为自定义struct/class类型重载运算符,例如complex -
@rjc810,首先,它们应该通过引用常量值来传递。接下来,尽管
a和b是“临时变量”,但这并不意味着它们是b ^ a等表达式中的r 值。在这种情况下,它们是左值。
标签: c++ types operator-overloading