如何为模板类之外的模板类使用模板参数?

时间:2018-10-24 19:58:00

标签: c++ templates matrix operator-overloading matrix-multiplication

这是一个初学者的问题:

如何为在模板类之外使用的函数使用模板参数?

这是我的使用模板的矩阵类。

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 :(得分:4)

好吧...如果要经典矩阵乘法...那么如果给定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)。

答案 1 :(得分:3)

app-name
 ᠁
[-]⋯Users
     ᠁
     ᠁⋯⋯ Peter: peter@gmail.com

实时:https://godbolt.org/z/5dJOXK

您也可以将它写为朋友,而不必重新输入所有模板内容:

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>{};
}

或作为成员:

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>};
    }
};