Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++初学者,所以我非常感谢你的帮助!p>_C++_Templates_Matrix_Overloading - Fatal编程技术网

模板参数变量/动态实例化 我是C++初学者,所以我非常感谢你的帮助!p>

模板参数变量/动态实例化 我是C++初学者,所以我非常感谢你的帮助!p>,c++,templates,matrix,overloading,C++,Templates,Matrix,Overloading,我目前正在使用数据类型、维度宽度和维度高度的模板参数实现一个矩阵类 template <class T, int rows, int columns> class Matrix 模板类矩阵 在乘法函数中,我必须创建结果矩阵(高度矩阵A x宽度矩阵B),但我收到错误“模板值不能出现在常量表达式中” //矩阵乘法的重载* 模板 矩阵算子*(矩阵a,矩阵b){ 矩阵结果=新矩阵高度,b->宽度>; //在这里进行乘法运算 你知道如何用给定的类型和a的高度以及B的宽度制作一个新的矩阵吗

我目前正在使用数据类型、维度宽度和维度高度的模板参数实现一个矩阵类

template <class T, int rows, int columns> class Matrix
模板类矩阵
在乘法函数中,我必须创建结果矩阵(高度矩阵A x宽度矩阵B),但我收到错误“模板值不能出现在常量表达式中”

//矩阵乘法的重载*
模板
矩阵算子*(矩阵a,矩阵b){
矩阵结果=新矩阵高度,b->宽度>;
//在这里进行乘法运算
你知道如何用给定的类型和a的高度以及B的宽度制作一个新的矩阵吗


非常感谢!让行和列作为构造函数的参数怎么样

template <class T> class Matrix
{        
public:           
   Matrix(int rows, int columns)
   {....}    
}
模板类矩阵
{        
公众:
矩阵(整数行,整数列)
{....}    
}
//然后,您可以使用以下内容创建新实例:

 Matrix <T>* result = new Matrix<T> (a->height, b->width)
Matrix*result=新矩阵(a->高度,b->宽度)

在这行中,它看起来像:

Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>;
矩阵结果=新矩阵高度,b->width>;
是错误。您正在尝试将新地址写入堆栈上声明的变量。 试试这个:

Matrix<T, int, int> *result = new Matrix<T, a->height, b->width>();
Matrix*result=newmatrixheight,b->width>();

在引用存储矩阵数据的模板类矩阵和作为模板方法的*运算符时,请尝试考虑两个不同的概念

如果您将*操作符看作是一个将模板类相乘的模板方法,那么您就会意识到需要更多的模板参数,并且这些参数只是矩阵类的一个实例给出的部分参数


给出该错误的原因是编译时不知道->宽度和->高度,并且必须在编译时知道每个模板参数。

正如错误所述,您不能从动态(运行时)值设置静态(编译时)“字段”

您可以(不说您应该)为两个矩阵的大小使用不同的模板参数,并使用它们创建一个新矩阵:

template <class T, int rows_A, int columns_A, int rows_B, int columns_B>
Matrix<T, rows_A, columns_B> operator*(Matrix<T, rows_A, columns_A> a, Matrix<T, rows_B, columns_B> b) {
    Matrix <T, rows_A, columns_B> result;
    // ...
    return result;
}

然而,这段代码不是很好看,也不容易使用。如果可以的话,你可以按照Matt的建议尝试将大小动态化(而不是参数模板)。

首先,你可能想查看你的矩阵乘法规则。例如,(r1,c1)矩阵乘以(r2,c2)矩阵需要c1==r2,并给出(r1,c2)结果。但是矩阵的大小没有指定,所以可以是任意数量的东西。有没有办法只创建一个没有列/行参数的新矩阵?可能类似于模板专门化,这可能是一个可能的解决方案?模板不是一种表达无限可能的方式。它们在代码中,但不是在程序正在运行。行和列的精确值在程序编译期间定义。如果矩阵的大小不可“定义”在编译过程中,您应该放弃使用模板的想法。此外,不要忘记,t/行/列的每一个组合都会使用您的模板生成一个新的唯一类定义。如果矩阵的大小差异很大,则模板可能会对您的应用程序造成风险。我真的不知道如何使用模板专门化,因为你必须自己对每个可能的T/行/列组合进行专门化…大量的代码足以证明模板不应该是理想的解决方案;)我收到一个错误“shadows template parameter”。我必须如何具体实现@RüdigerStevens提供的代码段?编译器如何知道“int rows\u A,int columns\u A\u rows\u B,int columns\u B”?由您在模板类实例化期间在代码中设置它:`矩阵A;矩阵B;矩阵C=A*B;`。此代码将为运算符*()行为10,列为5,列为8。不幸的是,它不起作用,g++编译器说:matrix.h:68:23:错误:“模板类矩阵”矩阵的模板参数列表中参数2的类型/值不匹配*结果=新矩阵高,B->width>();现在我明白了,这是我的错。如果有人试图运行此代码:请不要这样做。@Patrick谢谢你提供的信息。应该有:矩阵*结果=新矩阵(a->高度,b->宽度);但我必须使用模板,使用模板还有其他方法吗?@Patrick我认为没有其他方法。模板实例化发生在编译过程中,而不是在运行时,因此如果传递变量,编译器在编译时无法确定类型,这就是问题所在。
template <class T, int rows_A, int columns_A, int rows_B, int columns_B>
Matrix<T, rows_A, columns_B> operator*(Matrix<T, rows_A, columns_A> a, Matrix<T, rows_B, columns_B> b) {
    Matrix <T, rows_A, columns_B> result;
    // ...
    return result;
}
template <class T, int rows_A, int columns_A_rows_B, int columns_B>
Matrix<T, rows_A, columns_B> operator*(
    Matrix<T, rows_A, columns_A_rows_B> a,
    Matrix<T, columns_A_rows_B, columns_B> b
) {
    Matrix <T, rows_A, columns_B> result;
    // ...
    return result;
}