【发布时间】:2012-02-28 21:46:12
【问题描述】:
我正在尝试以可变大小的二维数组作为参数调用函数。为此,我使用了一个模板:
template <int N, int M>
void move(int (&arr)[M][N]);
现在,当我直接声明数组的大小时,这可以正常工作,例如:
int arr[5][7];
move(arr);
但如果我从其他地方获取尺寸,例如:
int x, y;
x = 7;
y = 5;
int arr[y][x];
move(arr);
编译器显示此错误:
没有匹配函数调用'move(int[((unsigned int)((int)y))][((unsigned int)((int)x))])
...我不明白。我对 c++ 相当陌生,这可能只是我很愚蠢,而且我知道 c++ 中的多维数组很有趣,但在这种情况下,我什至不明白问题出在哪里。有人有想法吗?
编辑:我奇怪地措辞了这个问题,对此感到抱歉 - 数组本身不会改变它的大小,但该函数应该能够处理不同大小的数组。问题是为什么当我直接声明数组的大小时有效,但当我声明每个维度的参数然后用这些声明数组时无效。
【问题讨论】:
-
C++ 中的数组具有固定的编译时常量大小。没有“不同大小的数组”这样的东西。它只是不存在。请改用
vector,或者使用 Boost.multiarray。 -
我的措辞可能很奇怪 - 数组本身不会改变它的大小,但该函数应该能够处理不同大小的数组。我会快速编辑它。
-
好的,但请注意,也没有动态确定大小的数组(类型)之类的东西。对不起。您必须手动或通过
std::vector等容器管理动态数组。 -
同意@KerrekSB,但是如果你想使用“手动”数组,至少要声明一个类来处理它们,比如
template <class T> class BidimensionalArray,带有T**类型的支持变量。 -
@KerrekSB:嗯,它们作为编译器扩展存在于 g++ 中。但它们不是标准 C++ 的一部分,不。如果“没有这样的事情”,编译器会在声明数组时给 OP 一个错误。但是当它尝试扩展模板(绝对不会处理非常量参数)时会给出错误。实际上,当它尝试扩展模板时,它没有段错误或类似的东西给我留下了深刻的印象。
标签: c++ multidimensional-array