我有一个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;
}
被修改
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
答案 0 :(得分:3)
不要让运营商成为会员。将operator*=
定义为Matrix的成员,然后在其实施中使用operator*
定义两个免费的*=
。
答案 1 :(得分:2)
在类外定义一个operator*
,它只是反转参数。并将另一个operator*
声明为const
。
template<typename T> Matrix<T> operator* (T k, const Matrix<T> &m) { return m * k; }
答案 2 :(得分:0)
班级成员operator *
对其对应的对象(左侧)进行操作,调用M * scalar
对应A.operator*(scalar)
- 如果您因为不要切换订单,这显然不适用没有为标量定义运算符*。您可以创建一个全局operator *
实现,它接受标量作为第一个(左)操作数,矩阵作为第二个。在实现内部切换顺序并调用您的inclass类operator *
。 E.g:
template <class T>
Matrix<T> operator *(T scalar, const Matrix<T> &M)
{
return M * scalar;
}