Умножить матрицу шаблонов C ++ - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть класс матрицы, определенный следующим образом:

template<int M, int N, typename T>
class Matrix
{
 typedef Matrix<M, N, T> MTYPE;
 /*...*/
};

Мне нужно реализовать умножение матриц, но я не знаю, как сделать переопределение операторов ..

Что-то вроде

MTYPE operator *(MTYPE& m) { /*...*/ }

Принимал бы только матрицу N * M. Так как я могу преодолеть эту проблему?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2011

Как было отмечено в комментарии, * = не имеет смысла для неквадратных матриц.

Для общего случая

template<int M, int N, typename T>
class Matrix
{
    typedef Matrix<M, N, T> MTYPE;
    /*...*/
public:
    template<int L>
    Matrix<M,L,T> operator*(const Matrix<N,L,T>& second) const
    {
       Matrix<M,L,T> result;
       for(...)
           for(...)
               for(...)
                   // ...
       return result;
    }
};

Или, если хотите, используйте оператор свободной функции * с двумя параметрами (и аргументами шаблона M, N, L и T) и сделайте его другом класса матрицы.

3 голосов
/ 12 декабря 2011

Вам нужно будет создать шаблонный оператор внутри или вне класса.

Например, чтобы умножить N x M на M x M, возможно, вы захотите сделать:

  template <int N, int M, class T>
  friend Matrix<N, M, T> operator*(const Matrix<N, M, T> &lhs, const Matrix<M, M, T> &rhs);

Другие версии выглядят аналогично.Вероятно, было бы наиболее полезно определить это вне класса.

Чтобы умножить (N1 x M) на (M x N2), вы должны сделать:

 template<int N1, int N2, int M, class T>
 friend Matrix<N1, N2, T> operator*(const Matrix<N1, M, T> &lhs, const Matrix<M, N2, T> &rhs);
...