У меня есть класс 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
Определить operator*
вне класса, который просто меняет аргументы. И объявить другой operator*
как const
,
template<typename T> Matrix<T> operator* (T k, const Matrix<T> &m) { return m * k; }
Не делайте оператора участником. Определить operator*=
в качестве члена матрицы, а затем определить два свободных operator*
, с помощью *=
в их реализации.
Ученик operator *
воздействует на соответствующий объект (слева), вызывая M * scalar
соответствует A.operator*(scalar)
— это, очевидно, не применяется, если вы меняете порядок, так как у вас нет оператора *, определенного для скаляра. Вы можете создать глобальный operator *
реализация, которая принимает скаляр в качестве первого (левого) операнда и матрицу в качестве второго. Внутри реализации переключите порядок и вызовите свой класс inclass operator *
, Например.:
template <class T>
Matrix<T> operator *(T scalar, const Matrix<T> &M)
{
return M * scalar;
}