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

我在 complex 中创建了一个 complex.h 结构并重载了一系列运算符(包括 ^)来处理四个操作 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 b){return a ^ complex(1/2);}};

我也尝试将 complex(1/2) 保留为双精度 .5 但这给了我同样的错误,除了操作数类型 complex ^ double

我的问题是操作符 ^ 如何不匹配 complex 类型的操作数,当它被定义为这样做时,并且在 op6 的初始化中这样做?

countmachine 回答:cpp 运算符在 std::function 中重载

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

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

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

complex operator^(complex const& lhs,complex const& rhs);
本文链接:https://www.f2er.com/13817.html

大家都在问