【问题标题】:cpp operator overloading inside std::functioncpp 运算符在 std::function 中重载
【发布时间】:2026-01-28 10:30:01
【问题描述】:

我在complex.h中创建了一个complex结构并重载了一系列运算符(包括^)来处理complex+doubledouble+doublecomplex+complexdouble+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,即opfunc

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&amp; lhs, complex&amp; rhs)。你看出区别了吗?
  • 请注意,您可能需要complex operator^(const complex&amp; lhs, complex&amp; rhs)。您无需修改​​ lhsrhs,这将允许您将临时变量或隐式转换为 complex 的内容传递给您的函数。
  • 另外,它应该是complex operator^(const complex&amp; lhs, const complex&amp; rhs) 使其能够接受临时的。
  • 仅供参考,您不能重载 double+double 的运算符,因为 double 是该语言的基本类型,并且它的运算符都是该语言的内置类型。您只能为自定义 struct/class 类型重载运算符,例如 complex
  • @rjc810,首先,它们应该通过引用常量值来传递。接下来,尽管ab 是“临时变量”,但这并不意味着它们是b ^ a 等表达式中的r 值。在这种情况下,它们是左值。

标签: c++ types operator-overloading


【解决方案1】:

您的运算符需要非常量引用:

complex operator^(complex& lhs, complex& rhs);

在表达式return a ^ complex(1/2) 中,第二个运算符是一个右值。 尝试使用 const 引用来定义操作:

complex operator^(complex const& lhs, complex const& rhs);

【讨论】: