2015-01-13 57 views
1

我試圖在我的Matrix類中爲*運算符重載。將類實例重載爲右邊的操作符

我有一個,使其如果是矩陣*的東西,(INT,雙...)

我在尋找一個使之成爲對面即東西*矩陣

這就是我想

template<class T> 
bool operator*(Matrix<T>& other){ 
Matrix<T> mat(other.rows,other.columns); 
for(int i=0;i<other.rows;i++){ 
    for(int j=0;j<other.columns;j++){ 
     T temp=other.get(i,j); 
     temp=temp*(this); 
     mat.set(i,j,temp); 
    } 
} 
return mat; 
}  

,這是矩陣*的東西是什麼在起作用

Matrix<T>& operator*(const T & num){ 
    Matrix<T> mat(rows,columns); 
    for(int i=0;i<rows;i++){ 
     for(int j=0;j<columns;j++){ 
      T temp=(matrix[i][j]); 
      temp=temp*num; 
      mat.set(i,j,temp); 
     } 
    } 
    return mat; 
}  

回答

2

ÿ OU應該讓一個非成員,就是你寫Matrix類之外:

template<class T> 
Matrix<T> operator*(const T& num, const Matrix<T>& mat) { 
    return mat * num; // invoke existing implementation of Matrix * something 
} 

注意operator*應該值返回結果。您的實施中存在一個錯誤,您將懸掛引用返回到本地變量mat

請注意,此表格要求numT型的,所以如果像你的榜樣,你有

Matrix<Rational> mat; 
mat = 3 * mat; 

它不能編譯,因爲3Rational

你可以做的是使用identity tricknum參數非推斷背景,所以它會從int轉換爲Rational

template<class T> 
Matrix<T> operator*(typename boost::mpl::identity<T>::type const& num, const Matrix<T>& mat) { 
    return mat * num; // invoke existing implementation of Matrix * something 
} 

哪裏identity只是

template<typename T> 
struct identity { typedef T type; }; 

或者你只能做

template<class T, class U> 
Matrix<T> operator*(const U& num, const Matrix<T>& mat) { 
    return mat * num; // invoke existing implementation of Matrix * something 
} 
+0

我試過這個,我得到了一些編譯錯誤 main.cpp:71:5:錯誤:'operator *'不匹配(操作數類型是'int'和'Matrix ') m = 3 * m; ^ main.cpp中:71:5:注:候選是:3:: 在文件從main.cpp中包括0: Matrix.hpp:229:12:注意:模板矩陣&運算符*(常量T& ,常量矩陣&) 矩陣&運算符*(常量T&NUM,常量矩陣&MATR){ ^ Matrix.hpp:229:12:注意:模板參數推導/置換失敗: main.cpp中:71: 6:注意:參數'T'('int'和'Rational')的推導衝突類型 m = 3 * m; ^ – keiloda

+0

@keiloda它有點不言自明 - 「3」是「int」而不是「Rational」,因此類型不匹配。 –

+0

@keiloda請參閱我的更新以瞭解解決方法 –