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

C++ 在c+中传递大小不同的二维数组+;,c++,multidimensional-array,C++,Multidimensional Array,我试图调用一个具有可变大小的二维数组作为参数的函数。为此,我使用了一个模板: template <int N, int M> void move(int (&arr)[M][N]); 但如果我从其他地方获取尺寸,例如: int x, y; x = 7; y = 5; int arr[y][x]; move(arr); 编译器显示此错误: 调用“move(int[((unsigned int)((int)y))][((unsigned int)((int)x))]时没有匹配

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

template <int N, int M>
void move(int (&arr)[M][N]);
但如果我从其他地方获取尺寸,例如:

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++。其次,使用C++中的裸数组是不赞成的。您应该改用
::std::vector

编译器错误消息真的很难理解。我很高兴它能给你一个而不是吹毛求疵。你提出了一个非常奇怪的案例

模板参数必须是编译时常量。它们不能是其值在运行时可能会更改的对象。编译器必须能够知道参数在编译时是常量。只有当值是实际文字值或声明为
constexpr
的命名值,或者是包含文字或声明为
constexpr
的值的简单表达式时,才会发生这种情况


对于具有变量边界的数组。。。这两个变量都不是
constexpr
s,因此它们可能在运行时发生更改。编译器无法提前知道要生成哪个版本的函数。

因为,尽管您为
x
y
提供静态已知值,但它们都是可变变量,因此,它们仍然不符合数组维度的标准。这样,模板函数就不能用这种奇怪的方式进行实例化

const unsigned int x = 7, y = 5;
这就足够了

不允许使用静态已知量以外的任何东西(例如,如上所述的文字量)初始化常量unsigned int


在C++ 11中,代码> > CONTXPRPR <代码>使得数组尺寸安全性更容易保证。C++中的数组< < /P>具有固定的编译时间常数大小。没有“大小不一的数组”这样的东西。它根本不存在。使用
向量
,或者使用Boost.multiarray。我可能用了一个奇怪的词-数组本身不会改变大小,但函数应该能够处理不同大小的数组。我将在real quick.OK中编辑它,但请注意,也没有动态确定大小的数组(类型)。很抱歉您必须手动或通过容器(如
std::vector
)管理动态数组。同意@KerrekSB,但如果您想使用“手动”数组,至少要声明一个类来处理它们,比如
template class BidimensionalArray
,带有类型为
T**
@KerrekSB的支持变量,它们作为编译器扩展存在于g++中。但是它们不是标准C++的一部分,没有。如果没有这样的东西,编译器会在声明数组时给OP一个错误。但是,当它尝试扩展模板(它绝对不会处理非常量参数)时,会出现错误。事实上,当它试图扩展模板时,它并没有出现segfault或类似的东西,这给我留下了深刻的印象。
const unsigned int x = 7, y = 5;