2013-04-11 63 views
-2

我想重载*运算符,以便它乘以类的复数子变量并返回复杂结果。我的想法是以下几点:运算符使用复数重载

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

但它不工作...任何想法或意见?

+3

*如何*它不”工作?有什么症状? “a”类的目的究竟是什么?为什么使用'使用命名空间std;'来编写'std :: complex'? – 2013-04-11 14:10:40

+3

“不起作用”不是一个足够的错误描述。 – filmor 2013-04-11 14:11:10

+0

为什么您需要与您的操作员进行温和的争论?您的班级不是模板,因此返回复杂的就足够了... – 2013-04-11 14:12:33

回答

3

您的班级持有std::complex<double>数据成员,不是模板。你需要一个非模板函数:

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

在你的榜样,也没有办法为你的模板函数来推断从传递给它的参数的返回类型。

0

我不能想办法做你在找什么(返回从operator*一个complex<T>),因为operator*不能自动扣除的类型,所以你必须指定类型,像波纹管的例子:

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

...或者你可以关注你@juanchopanza建议,不与operator*使用模板。

1

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

的用法如下:

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