2013-04-11 60 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; 
}