2013-11-21 40 views
1

我是C++中绝对的初学者,所以我真的很感谢你的帮助!模板参数变量/动态实例化

我目前正在执行一个矩阵类与模板参数的数据类型,尺寸宽度和高度尺寸。

template <class T, int rows, int columns> class Matrix 

在乘法函数我要创建的结果矩阵(身高基质A x宽矩阵B),但我收到错误“模板值不能显示在一个常量表达式”。

// overload * for matrix multiplication 
    template <class T, int rows, int columns> 
    Matrix<T, rows, columns> operator*(Matrix<T, rows, columns> a, Matrix<T, rows, columns> b) { 
    Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 
// make multiplication here 

任何想法如何使一个新的矩阵与给定的类型和从A的高度resp。宽度从B?

太谢谢你了!

+0

首先,您可能需要查看矩阵乘法规则。例如,(r1,c1)矩阵乘以(r2,c2)矩阵需要c1 == r2,并给出(r1,c2)结果。 –

回答

1

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

你可以(并不是说你应该)使用不同的模板参数的两个矩阵的大小并创建一个新的矩阵与他们:

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

正如乔Z.说,你会也必须先检查操作的有效性。因为columns_A必须等于rows_B,所以可以分解两个模板参数。

编辑:MMMMMMM写了这个分解在下面的评论:

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

然而,这段代码是不是真的很好看,也不方便使用。如果可以的话,您可以尝试使尺寸变为动态的思路(不是参数模板),正如Matt所建议的那样。

+0

但矩阵大小没有指定,所以它可以是任何数量的东西。有没有什么办法可以创建一个没有列/行参数的新矩阵?也许像模板专业化一样,这可能是一个可能的解决方案吗? – Patrick

+0

模板不是表达无限可能性的一种方式。他们在代码上,但不在程序运行时。行和列的精确值在程序编译期间定义。如果在编译期间矩阵的大小不是“可定义的”,则应放弃使用模板的想法。另外,不要忘记T/rows/columns的每个组合都将使用您的模板生成一个新的唯一类定义。如果您矩阵的大小差别很大,模板可能会对您的应用程序有风险。 –

+0

我真的不知道你可以用模板专门化来做什么,因为你必须自己专门化每一个可能的T /行/列组合......巨大的代码无非是证明模板不是一个理想的解决方案; ) –

1

如何化妆的行和列的构造函数的参数?

模板类矩阵

{
市民:
矩阵(INT行,诠释列) {....}
}

//那么你可以创建一个新的实例:

Matrix <T>* result = new Matrix<T> (a->height, b->width) 
+0

但我必须使用模板,有没有其他方式通过使用模板? – Patrick

+0

@帕特里克我不认为有另一种方式。模板实例化在编译期间发生,而不是在运行期间发生,所以如果你传递一个变量,编译器无法决定编译时类型是什么,这就是问题。 – Matt

-1

它看起来像在这一行:

Matrix <T, rows, columns> result = new Matrix<T, a->height, b->width>; 

是错误。您正在尝试将新的Address写入栈中声明的变量。指的是你的模板类矩阵存储矩阵和*运算符,它是一个模板方法的数据时

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

不幸的是,它不起作用,g ++编译器说: matrix.h:68:23:错误:类型/值在模板参数列表中的参数2不匹配模板<类T,int行,int列>类矩阵' Matrix * result = new Matrix height,b-> width>(); – Patrick

+0

现在我明白了,那是我的错。如果有人试图运行此代码:请不要这样做。 @Patrick感谢您的信息。应该是:Matrix * result = new Matrix (a-> height,b-> width); – marcinioski

1

尽量想两个不同的概念: 试试这个。

如果将*运算符看作乘法模板类的模板方法,那么您意识到需要更多的模板参数,并且这些参数仅由矩阵类的一个实例给出。

给出的错误是因为a-> width和a-> height在编译时不知道,编译时必须知道每个模板参数。