使用类实例作为右侧的运算符重载

时间:2015-01-13 11:38:52

标签: c++ templates matrix overloading operator-keyword

我正在尝试在我的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;
}    

1 个答案:

答案 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

请注意,此表单要求numT类型,因此,如果您的示例中有

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

它不会编译,因为3不是Rational

您可以使用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
}