std::function 中的 cpp 运算符重载

cpp operator overloading inside std::function

我在 complex.h 中创建了一个 complex 结构并重载了一系列运算符(包括 ^)来处理 complex+double、[=18= 这四个操作], 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,即 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 operator^(complex& lhs, complex& rhs);

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

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