Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;介绍';新';模板参数_C++_Templates - Fatal编程技术网

C++ C++;介绍';新';模板参数

C++ C++;介绍';新';模板参数,c++,templates,C++,Templates,我试图用模板参数中给出的维度和类型创建一个可重用的矩阵类。结构本身就是: template <unsigned int N, unsigned int M, typename T> struct Matrix { T elements[N* M]; }; 模板 结构矩阵 { T元素[N*M]; }; 当我尝试实现矩阵乘法时,我遇到了一个问题,需要引入新的模板参数。原始矩阵的大小是N*M。第二个矩阵的大小是L*N,结果矩阵是N*K。所以乘法函数看起来像: Matrix<

我试图用模板参数中给出的维度和类型创建一个可重用的矩阵类。结构本身就是:

template <unsigned int N, unsigned int M, typename T>
struct Matrix
{
    T elements[N* M];
};
模板
结构矩阵
{
T元素[N*M];
};
当我尝试实现矩阵乘法时,我遇到了一个问题,需要引入新的模板参数。原始矩阵的大小是N*M。第二个矩阵的大小是L*N,结果矩阵是N*K。所以乘法函数看起来像:

Matrix<N, K, T> Multiply(const Matrix<L, N, T>& other) {... }
矩阵乘法(常数矩阵和其他){…}
但是我需要为函数创建一个模板,因此调用将变成
mat.Multiply(mat2)
,这意味着我必须指定两次。有没有办法避免这种情况?(类似于矩阵)

编辑:我试过这个:

template <unsigned int K, unsigned int L>
Matrix<N, K, T> Multiply(const Matrix<L, N, T>& other)
模板
矩阵乘法(常数矩阵和其他)
在这段代码中,我得到一个错误,说没有函数模板的实例与参数列表匹配:

Matrix<3, 2, int> mat;
Matrix<2, 3, int> mat2;
mat.Multiply(mat2)
矩阵mat;
矩阵mat2;
mat.乘法(mat2)
顺便说一下,我正在使用MSVC和Visual Studio

因此调用将变成
mat.Multiply(mat2)

如果乘法成员函数是这样的函数模板

template <unsigned int N, unsigned int M, typename T>
struct Matrix
{
    template <unsigned int  L>
    Matrix<N, L, T> Multiply(const Matrix<M, L, T>& other) {... }
    T elements[N * M];
};
注:您可能应该考虑实现非成员<代码>运算符*/COM>,以允许:

auto mat3 = mat * mat2;

Multiply
也是模板,这很正常。 请注意,对于乘法,
K==L

template <unsigned int N, unsigned int M, typename T>
struct Matrix
{
    template <unsigned int K>
    Matrix<N, K, T> Multiply(const Matrix<M, K, T>& other) const {/*..*/}

    T elements[N* M];
};
模板
结构矩阵
{
模板
矩阵乘法(常数矩阵和其他)常数{/*../}
T元素[N*M];
};
在调用中,所有模板参数都是可推断的,因此可以这样调用:

int main()
{
    const int N = 4;
    const int M = 5;
    const int K = 6;
    using T = float;
    Matrix<N, M, T> rhs;
    Matrix<M, K, T> lhs;
    Matrix<N, K, T> res = rhs.Multiply(lhs);
}
intmain()
{
常数int N=4;
常数int M=5;
常数int K=6;
使用T=浮动;
矩阵rhs;
基质lhs;
矩阵res=rhs乘法(lhs);
}

我认为您没有抓住模板的重点-它们帮助泛化数据类型,而不是参数化值。因为矩阵是固定的,所以只指定矩阵的大小似乎也是合乎逻辑的。我猜我错了?@PeterLenkefi在类型中拥有矩阵的维度是个好主意。它允许您在编译时限制无效操作。@PeterLenkefi您可以在函数中指定大小(例如在构造函数中,因为您使用的是c++)。在模板参数中指定泛化类型。@Lasoloz这没有任何意义。OP的想法很好。缺少的只是乘法函数作为模板。我尝试过类似的方法,但编译器并不喜欢它。@PeterLenkefi我把
other
矩阵的维数弄错了,我想你也弄错了。请看编辑。谢谢,我实际上错过了K==L这一事实!
int main()
{
    const int N = 4;
    const int M = 5;
    const int K = 6;
    using T = float;
    Matrix<N, M, T> rhs;
    Matrix<M, K, T> lhs;
    Matrix<N, K, T> res = rhs.Multiply(lhs);
}