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
,即 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 operator^(complex& lhs, complex& rhs);
在表达式 return a ^ complex(1/2)
中,第二个运算符是右值。
尝试使用 const 引用定义操作:
complex operator^(complex const& lhs, complex const& rhs);
我在 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
,即 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 operator^(complex& lhs, complex& rhs);
在表达式 return a ^ complex(1/2)
中,第二个运算符是右值。
尝试使用 const 引用定义操作:
complex operator^(complex const& lhs, complex const& rhs);