我是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的宽度?
非常感谢你!
答案 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>();