2016-04-03 140 views
4

我試圖實現一個矩陣類,該類可以處理實矩陣和復矩陣。當我嘗試重載乘法運算符時遇到問題。具體來說,當我嘗試乘以一個複合矩陣的雙重矩陣(按此順序)。結果應該是複雜的,但*運算符是在這種情況下的雙重矩陣的成員,我不明白如何返回一個複雜的矩陣(我試過使用朋友操作符,這似乎並不工作)。下面是相關的代碼片段:C++運算符爲具有實矩陣和復矩陣的矩陣類重載

template <class V> Matrix<T> operator *(const Matrix<V> &b) 
{ 
    long i, j, k; T temp; Matrix<T> c(mRows, b.Cols()); 

    for (i = 0; i < mRows; i++) 
     for (j = 0; j < c.Cols(); j++) 
     { 
      for (temp = 0, k = 0; k < mCols; k++) 
       temp += this->Element(i, k)*b.Element(k, j); 

      c(i, j) = temp; 
     } 

     return c; 
} 

因此,如果是真實的,B和C是複雜的,C = B 一個工作正常,但C = A B沒有。具體來說,編譯器錯誤會標記「temp + =」行,表示沒有找到需要複雜類型的全局運算符(或者沒有可接受的轉換)。我想避免完全專注於真實和複雜類型的模板,有沒有辦法解決這個問題?

在此先感謝。

+0

要聲明'模板矩陣的operator *(const的矩陣&A,常量矩陣&B)' –

+0

參見[運算符重載(http://stackoverflow.com/questions/4421706/operator-overloading)請。 –

+0

謝謝,但這將不得不宣佈爲朋友操作員,不是嗎?這就產生了一個新問題,即多個操作符匹配操作數。 – DJM123

回答

-1

我想在這個問題: 這個 - >元素(...)

我不知道該怎麼做了固定。但我爲了改變兩個矩陣的地方。 (A < - > B)

+1

對不起,我沒有得到你寫的東西。你能否更詳細地闡述它。您告訴: – surajsn

+0

:C = BA工作正常,但C = AB不起作用。 我說:解決這個問題有兩種方法。專業 2.工程 方式2很簡單。這種方式告訴我們,以最簡單的方式得到答案。你可以通過改變矩陣A和B來得到答案。另一方面,你將C = AB轉換爲C = BA。 尋找簡單的方式獲得答案不包裝的方式 –

+0

弟弟。 !我請你認真考慮我的話**,但不要親自。我已經看到你的個人資料,你非常熱心地在這裏寫下答案,這對你很好。但我可以很容易地看到你的答案大部分是**倒票**。我看到你的答案,發現你不能很好地解釋他們。這就是爲什麼我要求你在寫答案之前做一些研究,並總是試着重複一遍,總是儘量在寫答案的時候給予你最好的答案,因爲它不是關於聲譽或者徽章。這是關於給你最好的,所以不要認爲是理所當然的。 **保持微笑和愉快的編碼**。 :) – surajsn

2

正如在評論中提到的那樣,在這種情況下,最好使用operator*的非成員超載(與矩陣類一起使用)。

但這並不是它不起作用的原因。這裏的問題是

T temp; Matrix<T> c; 

在您的課operator*。此時應更換每個Tstd::common_type_t<T,U>

using C = std::common_type_t<T,U>; 
C temp; Matrix<C> c; 

否則元素類型返回矩陣的永遠是一樣調用矩陣。也就是說,當您撥打C = A*B解析爲C = A.operator*(B)時,C的元素類型將與A相同。

那麼如果AMatrix<double>,你有Matrix<complex<double> >乘它,你會得到一個Matrix<double>作爲回報 - 這顯然是錯誤的。

+0

太棒了,喜歡這個解決方案,謝謝!它實際上可以與原始的二進制重載*相配合;是否有理由避免這種做法,即朋友超載是否可取? – DJM123

+0

@ DJM123:不客氣。關於這個問題,請參閱[這裏](http://stackoverflow.com/a/4421729/2412846)。 – davidhigh

+0

@ DJM123:...但我的鏈接並沒有給出使用非成員重載的動機,因此更好看[這裏](http://stackoverflow.com/a/4622467/2412846)。 – davidhigh