我正在尝试在我的Matrix类中对*运算符执行重载。
如果它是Matrix *的东西,我会有一个,(int,double ...)
我正在寻找一个能让它出现在对面的东西,即* Matrix
这是我试过的
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 *的东西
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;
}
答案 0 :(得分:2)
你应该把它变成非成员,就是你在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
。
请注意,此表单要求num
为T
类型,因此,如果您的示例中有
Matrix<Rational> mat;
mat = 3 * mat;
它不会编译,因为3
不是Rational
。
您可以使用identity trick将num
参数放在非推断的上下文中,因此它会从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
}