我想将数组A,B相乘。这些阵列具有固定的大小。我用模板推断出它们的大小。现在我想为C分配一些等于A * B的内存。我的问题是,当我这样做时(N = 3,L = 5)
int (*C)[N][L] = new int[N][L]
我得到了
error: cannot convert ‘int (*)[5]’ to ‘int (*)[3][5]’ in initialization
。
我做了一个解决方法,但仍然想知道如果没有解决方法我该怎么办呢。
template<int N, int K>
struct matrix {
int array[N][K];
};
template<int N, int K, int L>
int (&multiply(int (&A)[N][K], int (&B)[K][L]))[N][L] {
matrix<N,L> *mat = new matrix<N,L>();
int (&C)[N][L] = mat->array;
return C;
}
int main() {
int A[3][4];
int B[4][5];
int (&C)[3][5] = multiply(A, B);
}
您可以使用typedef
或reinterpreted_cast
制作其他解决方案,但为什么需要它们?这就像c ++本身的失败,语言未能兑现承诺。它类似于Java中的泛型。您认为像List<T>
这样的容器会更好地了解但是它们在使用转换和@SuppressWarnings
时遵循相同的错误方式。
答案 0 :(得分:1)
的问题
int (*C)[N][L] = new int[N][L];
是new T[n]
返回指向T
的指针。已分配数组的事实在返回类型中不可见。因此,表达式new int[N][L]
返回指向L
的大小 - int
数组的指针。这是LHS所需的类型:
int (*C)[L] = new int[N][L];