模板参数变量/动态实例化

时间:2013-11-21 13:54:57

标签: c++ templates matrix overloading

我是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的高度制作新Matrix的任何想法。 B的宽度?

非常感谢你!

4 个答案:

答案 0 :(得分:1)

如何将行和列作为构造函数的参数?

template <class T> class Matrix
{        
public:           
   Matrix(int rows, int columns)
   {....}    
}

//然后你可以用:

创建一个新实例
 Matrix <T>* result = new Matrix<T> (a->height, b->width)

答案 1 :(得分:1)

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

如果你认为*运算符是一个模板方法,它将模板类相乘,那么你就会意识到你需要更多的模板参数,并且这些参数只是部分由矩阵类的一个实例给出。

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

答案 2 :(得分: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;
}

正如Joe 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所建议。

答案 3 :(得分:-1)

看起来就像这一行:

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

是错误。您正在尝试将新地址写入堆栈上声明的变量。 试试这个:

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