1

可能重复:
对数组的引用参数有什么用处?
如何在 C++ 中使用数组?

我正在尝试通过引用传递数组。问题是我在传递这些数组时遇到错误。

错误 C2664:“InitializeArrays”:无法将参数 1 从“int [64]”转换为“int (&)[]”

这是代码:

void InitializeS(int (&s)[], int (&BeforeDecimal1)[]);

int main()
{
   int BeforeDecimal[128],s[128];

   InitializeS(s,BeforeDecimal);

   return 0;
}

void InitializeS(int (&s)[], int (&BeforeDecimal1)[])
{
    for(int i=0;i<128;i++)
    {
        s[i]=0;
        BeforeDecimal1[i]=0;
    }
}

我究竟做错了什么?

4

3 回答 3

4

在 C++ 中,与在 C 中不同的是,没有兼容类型的概念,并且类型 T[] 与 T[N] 无关。您需要使引用具有大小,并且大小必须等于您传递的数组之一。

C++ 还禁止将无边界数组的引用作为函数参数类型(可能是因为这个原因)。

于 2012-12-21T10:32:30.800 回答
3

为什么你的不起作用

“数组”函数参数语法void foo(int array[])具有误导性,因为它与数组无关。对于. _ _void foo(int* array)

因此,void foo(int (&array)[])不做你认为它做的事。它甚至不等于void foo(int*& array). 事实上,语法根本不存在。


通过引用传递数组

真正的数组有维度,而这些维度是静态类型的一部分(你看到int[]的任何“类型”要么将其用作不完整的类型,要么只是其他东西的语法糖),所以你需要声明具有以下类型的维度:

void foo(int (&array)[5])

或使用模板:

template <size_t N>
void foo(int (&array)[N])

如果我做不到怎么办?

如果您在编译时不知道维度,那么您就是 SOL,必须使用 astd::vector代替。

于 2012-12-21T10:41:52.760 回答
0

正如 FredOverflow 所建议的,您需要使用模板来实现此功能。

这是实现它的一种方法:

template<int S1, int S2> void InitializeS(int(&)[S1], int(&)[S2]);

int main()
{
   int BeforeDecimal[100],s[50];

   InitializeS(s,BeforeDecimal);

   return 0;
}

template<int S1, int S2> void InitializeS(int (&s)[S1], int (&BeforeDecimal1)[S2])
{
    for(int i=0;i<128;i++)
    {
        s[i]=0;
        BeforeDecimal1[i]=0;
    }
}

请注意,这仅在数组的大小在编译时已知的情况下才有效。

于 2012-12-21T10:43:12.500 回答