在c ++中传递不同大小的二维数组

时间:2012-02-28 21:46:12

标签: c++ multidimensional-array

我正在尝试使用可变大小的二维数组作为参数调用函数。为此,我使用了一个模板:

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 ++中的多维数组很有趣,但在这种情况下我甚至不明白问题是什么。有人有想法吗?

编辑:我措辞奇怪,对不起 - 数组本身并没有改变它的大小,但该函数应该能够处理不同大小的数组。问题是为什么当我直接声明数组的大小时这是有效的,但是当我声明每个维度的参数然后用那些声明数组时。

2 个答案:

答案 0 :(得分:2)

声明一个像这样的变量边界的数组首先是一个扩展。它实际上不是有效的标准C ++。其次,在C ++中使用裸阵列是不受欢迎的。您应该使用::std::vector代替。

编译器错误消息确实非常难以理解。而且我很开心它能够给你一个而不是断层。你正在展示一个非常奇怪的案例。

模板参数必须是编译时常量。它们不能是其值在运行时可能发生变化的事物。编译器必须知道参数在编译时是恒定的。只有当值是实际文字值或声明为constexpr的命名值或涉及文字或声明为constexpr的值的简单表达式时,才会发生这种情况。

对于带有变量边界的数组...这些变量都不是constexpr,因此它们可能会在运行时发生变化。编译器无法事先知道要生成哪个版本的函数。

答案 1 :(得分:1)

因为,尽管您为xy提供了静态已知值,但这些都是可变变量,因此它们仍然不符合数组维度的条件。然后,模板函数无法使用该奇数进行实例化。

const unsigned int x = 7, y = 5;

这就足够了。

使用静态已知数量以外的任何内容初始化const unsigned int(例如文字,如上所述)将

constexpr使得在C ++ 11中更容易保证数组维度安全。