在函数中将数组作为引用参数传递

时间:2011-12-11 16:42:09

标签: c++ arrays arguments

我试图将两个多维数组作为参考参数传递给C ++中的函数。

原型编写如下:

void func(char (&foo)[4][4], char (&bar)[4][4]);

我的问题是第二个参数不会作为引用参数传递,但第一个参数会传递。如果我改变它们的位置 - 那么(& foo)[4] [4]是第二个,反之亦然 - foo不会作为参考传递但是bar会传递。

但是,如果我添加第三个参数,则第二个参数将作为参考传递。

如何在不添加其他无用参数的情况下解决此问题?

3 个答案:

答案 0 :(得分:3)

尝试使用typedef最小化谚语足的大小:

typedef char charray44[4][4];

void foo(charray44 & one, charray44 & two);

这应该按预期工作;如果没有,你应该能够设置一个简单的测试工具来找出你犯了错误的代码中的(其他)。

答案 1 :(得分:1)

void foo(char (&one)[4][4], char (&two)[4][4]){
}

int main(){
    char one[4][4];
    char two[4][4];
    foo(one, two);
}

在MSVC,GCC和Clang上编译正常。你的问题出在其他地方。

答案 2 :(得分:1)

作为Xeos解决方案的补充,解决此问题的一种更好的方法是封装数组并通过引用传递新对象。

class matrix{
     std::vector<char> values;
     size_t x_sz, y_sz;
public:
     matrix(size_t x, size_t y) : values(x*y), x_sx(x), y_sz(y) {}

     char& get_at(size_t x, size_t y) 
     { return values[y*x_sz+x]; }

     const char& get_at(size_t x, size_t y) const
     { return values[y*x_sz+x]; }
 };

然后你可以传递给funcs,如。

   void f(const matrix& a);