2011-12-21 31 views
2
template <size_t M, size_t N, typename T> 
class Matrix 
{ 
public: 
    Matrix<M, N, T> operator +(const Matrix<M, N, T>& B) const; 
    template <size_t P> Matrix<M,P,T> operator*(const Matrix<N, P, T>& B) const; 
    template <typename T2> operator T2() const; 

private: 
    T __x[M][N]; 
}; 

身體寫得很好,而且一切正常。當我定義兩個矩陣如下:我有一個像下面這樣的矩陣類:

Matrix < 10, 10, int> m1; 
Matrix < 10, 10, float> m2; 

m1 + m2; // OK 
m1 * m2; // error: no match for 'operator*' in 'm1 * m2' 

添加效果很好,因爲隱式轉換已在其上進行的,但由於不同的值類型的乘法,會發生錯誤。

error: no match for 'operator*' in 'm1 * m2' 

有什麼想法?

+0

這是一個PHP或MySQL的問題? – GordonM 2011-12-21 08:49:43

+1

我是否遺漏了一些php或wtf的類? – 2011-12-21 08:58:45

+0

您可以發佈您收到的整個錯誤消息嗎? – 2011-12-21 10:23:35

回答

2

This question有類似的問題。您出錯的原因是在推導模板參數時不考慮隱式轉換。由於您的乘法運算符是一個函數模板,並且您未明確提供該參數就會調用,編譯器會嘗試推斷參數類型並失敗。爲了證明,如果你明確提供的參數P,它編譯:

m1.operator*<10>(m2); 

要解決這個問題,你可以使價值型右手邊的一個模板參數太多:

template <size_t P, typenmame T2> 
Matrix<M,P,T> operator*(const Matrix<N, P, T2>& B) const; 
+0

然後,我有點驚訝它適用於'op +'。 – 2011-12-21 10:28:37

+0

@ TomalakGeret'kal:它不是一個函數模板,因此不需要推論任何參數。 – 2011-12-21 10:30:20

+0

好的,是的;但是'op *'中的'T'也不是推導出來的。 – 2011-12-21 10:31:06

相關問題