0

Matrixクラスがあります。乗算演算子をオーバーロードしていますが、Matrixスカラーを呼び出した場合にのみ機能します。スカラー行列では機能しません。どうすればこれを修正できますか?

#include <iostream>
#include <stdint.h>

template<class T>
class Matrix {
public:
    Matrix(unsigned rows, unsigned cols);
    Matrix(const Matrix<T>& m);
    Matrix();
    ~Matrix(); // Destructor

Matrix<T> operator *(T k) const;

    unsigned rows, cols;
private:
    int index;
    T* data_;
};

template<class T>
Matrix<T> Matrix<T>::operator *(T k) const { 
    Matrix<double> tmp(rows, cols);
    for (unsigned i = 0; i < rows * cols; i++)
        tmp.data_[i] = data_[i] * k;

    return tmp;
}

template<class T>
Matrix<T> operator *(T k, const Matrix<T>& B) {
    return B * k;
}

編集済み


chill が提案したものを実装しましたが、次のエラーが発生します。

main.cpp: In function ‘int main(int, char**)’:
main.cpp:44:19: error: no match for ‘operator*’ in ‘12 * u2’
main.cpp:44:19: note: candidate is:
lcomatrix/lcomatrix.hpp:149:11: note: template<class T> Matrix<T> operator*(T, const Matrix<T>&)
make: *** [main.o] Error 1
4

3 に答える 3

3

オペレーターをメンバーにしないでください。operator*=をMatrixのメンバーとして定義してから、実装operator*で使用*=して2つのfreeを定義します。

于 2012-11-22T14:03:17.577 に答える
2

クラスの外部を定義operator*します。これは引数を逆にするだけです。そして、もう一方operator*をとして宣言しconstます。

template<typename T> Matrix<T> operator* (T k, const Matrix<T> &m) { return m * k; }
于 2012-11-22T14:07:18.553 に答える
0

クラスメンバーoperator *は、対応するオブジェクト(左側)を操作します。呼び出しM * scalarはに対応しA.operator*(scalar)ます。スカラーに演算子*が定義されていないため、順序を切り替えた場合、これは明らかに適用されません。最初の(左)オペランドとしてスカラーを受け入れ、2番目のオペランドとして行列を受け入れるグローバルoperator *実装を作成できます。実装内で順序を切り替えて、クラス内クラスを呼び出しますoperator *。例えば:

template <class T>
Matrix<T> operator *(T scalar, const Matrix<T> &M)
{
    return M * scalar;
}
于 2012-11-22T14:07:07.930 に答える