2015-08-09 64 views
0

我寫了一個矩陣類。我已經重載了operator +,以便用戶可以編寫:matrix + 2.我希望用戶也寫:2 +矩陣。如何在泛型類中使用朋友函數重載運算符?

對於標準格式(即對象調用2),我寫了一個標準的運算符重載函數。有用。

template<typename T> 
Matrix<T> Matrix<T>::operator+(const T& rhs) const 
{ 
    Matrix result(rows, cols, 0.0); 
    for (unsigned i = 0; i < rows; ++i) 
    { 
     for (unsigned j = 0; j < cols; ++j) 
     { 
      result(i,j) = (*this)(i, j) + rhs; 
     } 
    } 
    return result; 
} 

現在對於其他順序(即2 +矩陣),我已經寫了友元函數:

// Friend Functions that allow the user to write expressions in a different order 
    template<typename T> 
    friend Matrix<T> operator+(const T& type, const Matrix<T>& matrix); 

和實施爲:

template<typename T> 
Matrix<T> operator+(const T& type, const Matrix<T>& matrix) 
{ 
    return matrix + type; 
} 

當我嘗試寫2 +矩陣(在main())中,我得到一些錯誤。

我一直有使用泛型類的朋友函數的問題,坦率地說,我從來沒有明白爲什麼它從來沒有爲我工作。

有人能解釋我在做什麼錯嗎?

錯誤,我得到:

智能感知:無操作「+」匹配這些操作數的操作數類型是:INT +矩陣

嚴重性代碼說明項目文件行錯誤C2244「矩陣::運算符+」:無法將函數定義與現有聲明相匹配

+0

@txtechhelp但朋友功能不是一個成員函數,所以它如何使用Matrix的範圍解析運算符

+0

誤讀代碼/問題..道歉..我正在重新閱讀關於朋友/模板的規範,因爲您的問題是一個模板演繹錯誤(即編譯器無法正確推斷模板化的朋友函數)..將發佈相關的答案/評論。 – txtechhelp

+0

如果你的朋友函數是在Matrix類中聲明的,你不能只需在類中進行以下操作:'朋友矩陣運算符+(const T&type,常量矩陣和矩陣){返回矩陣+類型; }'因爲這是一個簡單的操作,並且如果它在標題中,可能會打開一些優化內聯。 – txtechhelp

回答

1

看起來它只是一個模板演繹錯誤;也就是說,您的編譯器無法根據模板化的朋友函數推導出正確的函數。由於你的朋友函數是一個簡單的函數,所以你可以在你的類/頭文件中聲明它,編譯器應該能夠正確地推導出它(如果打開優化,也可能內聯它)。只是聲明友元函數在你的頭就像這樣:

friend Matrix operator+(const T& type, const Matrix& matrix) 
{ 
    return matrix + type; 
} 

你並不需要指定template關鍵字,因爲這是你的模板專業類中。

希望能有所幫助。

+0

這可以解決問題。我仍然沒有成功實現一個通用類中的朋友函數(在.cpp文件中實現)。好吧。 –

1

只需將成員函數更改爲const即可解決問題。

template<typename T> 
Matrix<T> Matrix<T>::operator+(const T& rhs) const 
{ 
    ... 
} 
+0

這絕對是正確的,但它沒有解決我的問題。我還有:嚴重性\t代碼\t說明\t項目\t文件\t行錯誤\t C2784 \t '的std :: _ Vb_iterator <_Alloc>的std ::運營商+(_的Alloc :: difference_type,性病:: _ Vb_iterator <_Alloc>)':不能推導出模板參數爲'std :: _ Vb_iterator <_Alloc>'from'QS –

+0

@Ryan,這似乎是一個不同的問題。我猜測這跟調用的返回類型有關(*(this)(i,j)' –

+0

)它返回T&,這正是我想要的。 –