Как использовать аргументы шаблона для класса шаблона вне его? - PullRequest
0 голосов
/ 24 октября 2018

Это вопрос новичка:

Как использовать аргументы шаблона для функции, которая работает с классом шаблона вне его?

Это мой матричный класскоторый использует шаблон.

template<typename T, int N, int M>
class matrix {
    T vals[N][M] = {};

public:
    matrix() {
        //sth
    }
};

Теперь я хочу написать для него операцию (умножение) вне класса.Как это работает с параметрами шаблона?

matrix<?????????> operator*(matrix<<?????????>& m1, matrix<?????????>& m2) {
    //multiply code
}

Что мне нужно написать, где пишутся знаки вопроса?Такой же?typename T, int N, int M

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Ну ... если вы хотите классическое матричное умножение ... поэтому, если дана матрица D1xD2, умноженная на матрицу D2xD3, вы хотите матрицу D1xD3 ...

template <typename T, std::size_t D1, std::size_t D2, std::size_t D3>
matrix<T, D1, D3> operator* (matrix<T, D1, D2> const & m1,
                             matrix<T, D2, D3> const & m2)
 {
   // ....
 }

Вне темы: я предлагаю(как вы можете видеть в моем примере) использование значения без знака (возможно, std::size_t) для измерений.

0 голосов
/ 24 октября 2018
template<typename T, int N, int M>
class matrix {
    T vals[N][M] = {};

public:
    matrix() {
        //sth
    }
};

template <typename T, int N, int M>
matrix<T, N, M> operator*(matrix<T, N, M> l, matrix<T, N, M> r) {
    return matrix<T, N, M>{};
}

в прямом эфире: https://godbolt.org/z/5dJOXK

Вы также можете написать это как друга, и вам не нужно будет повторно набирать все содержимое шаблона:

template<typename T, int N, int M>
class matrix {
    T vals[N][M] = {};

public:
    matrix() {
        //sth
    }

    friend matrix<T, N, M> operator*(matrix<T, N, M> l, matrix<T, N, M> r) {
        return matrix<T, N, M>};
    }
};

или просто какчлен:

template<typename T, int N, int M>
class matrix {
    T vals[N][M] = {};

public:
    matrix() {
        //sth
    }

    matrix<T, N, M> operator*(matrix<T, N, M> r) {
        return matrix<T, N, M>{};
    }
};
...