2012-04-02 86 views
0

Heloo,我在重載模板類中的成員函數中的/運算符時遇到問題。我得到錯誤'錯誤C2805:二進制'運算符/'有太少參數',但我想我給操作員足夠的參數。這裏是使用類模板並重載/運算符

template <class T> 
typename complex<T>::complex operator/(complex<T> &c) 
{ 
    complex temp; 
    temp.re = (re*c.getRe() + im*c.getIm())/(pow(c.getRe(),2)+pow(c.getIm(),2));  
    temp.im = (im*c.getRe() - re*c.getIm())/(pow(c.getRe(),2)+pow(c.getIm(),2)); 
    return temp; 
} 

我的函數聲明中給出以下

T operator/(complex<T> &c); 

我的聲明是indside類模板和外部的聲明,但相同的命名空間中的我的頭文件中的代碼部分。如果你需要整個代碼,請讓我知道。謝謝。

回答

0

你缺少一個類前綴的操作定義:

complex<T>::operator /(complex<T> &c) 

而且,你聲明的操作爲返回T - 你爲什麼要在定義返回complex

+0

對不起,類前綴?這是什麼意思?我也將函數的聲明從T改爲複雜,並且我得到的錯誤數量急劇下降。謝謝。 – oxidising 2012-04-02 10:11:17

+0

@ user1303032,當你在類聲明之外定義一個成員函數的實現時,你需要在函數名前加上cla​​ss name,如下所示:classA :: func1。 – 2012-04-02 10:37:17

+0

非常好,謝謝。 – oxidising 2012-04-02 11:05:10

0

您聲明瞭一個新的自由函數,而不是您在類定義中聲明的函數。

template <class T> 
typename complex<T>::complex operator/(complex<T> &c) 
     ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^ 
      return type  function name 

你可以看到你在那裏失蹤 - 範圍解析。您只能將二元運算符作爲自由函數進行重載,因此會出現編譯器錯誤。

這將滿足您的類聲明:

template<class T> 
T complex<T>::operator/(complex<T>& c) 
{ 
    // ... 
} 

可編譯例子:

Ideone

話又說回來,從operator/獨自返回模板參數可能不是你想要的,你'd想要返回一個類實例。所以我認爲你真正需要的是這樣的:

template<class T> 
complex<T> complex<T>::operator/(const complex<T>& c) 
{ 
    // ... 
} 
+0

謝謝。你能否向我解釋爲什麼需要兩個複雜的? – oxidising 2012-04-02 10:53:12

+0

@Gar兩個混淆你的哪一個? – jrok 2012-04-02 11:00:17

+0

我只是想知道爲什麼在複雜的 :: operator ...部分之前需要複雜的? – oxidising 2012-04-02 11:04:33