【问题标题】:operator overloading with complex numbers具有复数的运算符重载
【发布时间】:2013-04-11 14:09:47
【问题描述】:

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

#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;
}

但它不起作用......有什么想法或cmets?

【问题讨论】:

  • 怎么不起作用?有什么症状? a 类的目的到底是什么?还有你为什么用using namespace std;然后写std::complex
  • “它不起作用”不是一个充分的错误描述。
  • 为什么你的操作符需要 tempate 参数?您的课程不是模板,因此返回 complex 就足够了...
  • 在你的模板函数中,没有使用T类型。

标签: c++ templates operator-overloading


【解决方案1】:

您的班级拥有std::complex&lt;double&gt; 数据成员,并且不是模板。你需要一个非模板函数:

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

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

【讨论】:

    【解决方案2】:

    Complex 类已经解决了这个问题,即它总是在乘法之后返回复数结果。

    用法如下:

    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;
    }
    

    【讨论】:

      【解决方案3】:

      我想不出一种方法来做你正在寻找的东西(从operator*返回complex&lt;T&gt;)因为operator*不能自动扣除类型,所以你必须指定类型,比如在下面的例子中:

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

      ...或者您可以遵循@juanchopanza 的建议,不要使用带有operator* 的模板。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-25
        相关资源
        最近更新 更多