复数运算符重载

operator overloading with complex numbers

本文关键字:重载 运算符      更新时间:2023-10-16

我想重载*操作符,以便它将类的复杂子变量相乘并返回复杂的结果。我的想法如下:

#include <complex>
using namespace std; 
class a{
public:
  std::complex<double> x0;
...
};
template<class T> complex<T>  operator*(const a &lfv, const a &rfv){
  return lfv.x0*rfv.x0;
}

但是它不工作…有什么想法或评论吗?

您的类包含std::complex<double>数据成员,并且不是模板。你需要一个非模板函数:

std::complex<double> operator*(const a& lfv, const a& rfv){
  return lfv.x0*rfv.x0;
}

在您的示例中,模板函数无法从传递给它的参数中推断出返回类型

Complex class已经处理了这个问题,即它总是在乘法之后返回复杂的结果。

用法如下:

complex<double> p(10,20);
complex<double> q(2,3);
std::cout << p*q << endl;

输出是:

(-40,70)

或者你可以这样做:

class a{
public:
  std::complex<double> x0;
};
complex<double>  operator*(const a &lfv, const a &rfv){
  return lfv.x0*rfv.x0;
}
int main()
{
    a  y;
    y.x0 = complex<double>(10,20);
    a  z;
    z.x0 = complex<double>(10,20);
    std::cout << y*z << endl;
}

我无法想到一种方法来做你正在寻找的(从operator*返回complex<T>),因为operator*不能自动扣除类型,所以你必须指定类型,如下面的例子所示:

a my_var1;
a my_var2;
complex<double> result = operator*<double>(my_var1, my_var2);

…或者你可以按照@juanchopanza的建议,不要使用operator*的模板。