Как я могу перегрузить оператор умножения?

У меня есть класс 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

Решение

Определить operator* вне класса, который просто меняет аргументы. И объявить другой operator* как const,

template<typename T> Matrix<T> operator* (T k, const Matrix<T> &m) { return m * k; }
2

Другие решения

Не делайте оператора участником. Определить operator*= в качестве члена матрицы, а затем определить два свободных operator*, с помощью *= в их реализации.

3

Ученик operator * воздействует на соответствующий объект (слева), вызывая M * scalar соответствует A.operator*(scalar) — это, очевидно, не применяется, если вы меняете порядок, так как у вас нет оператора *, определенного для скаляра. Вы можете создать глобальный operator * реализация, которая принимает скаляр в качестве первого (левого) операнда и матрицу в качестве второго. Внутри реализации переключите порядок и вызовите свой класс inclass operator *, Например.:

template <class T>
Matrix<T> operator *(T scalar, const Matrix<T> &M)
{
return M * scalar;
}
0
По вопросам рекламы [email protected]