推导出参数“_BIter”的冲突类型('int*' 和 'int')

deduced conflicting types for parameter '_BIter' ('int*' and 'int')

我正在尝试实现一个简单的反向数组函数:

void reverse(int (&arr)[], int n)
{
  int start = 0, end = n - 1;

  while (start <= end)
  {
    int temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    start++;
    end--;
  }
}

在我的 main() 中我有这个:

int brr[9]{10, 20, 30, 40, 50, 60, 70, 80, 90};
for (int i = 0; i < 9; i++)
{
  cout << brr[i] << " ";
}
cout << endl;

reverse(brr, 9);
for (int i = 0; i < 9; i++)
{
  cout << brr[i] << " ";
}

我怎么也弄不明白为什么会出现这个错误:

no matching function for call to 'reverse(int [9], int)'
65 |   reverse(brr, 9);

no known conversion for argument 1 from 'int [9]' to 'int (&)[]'
12 | void reverse(int (&arr)[], int n)

deduced conflicting types for parameter '_BIter' ('int*' and 'int')
65 |   reverse(brr, 9);

我想知道这是什么行为以及如何纠正它?

谢谢!

在此函数声明中:

void reverse(int (&arr)[], int n);

arr 的类型是对未知边界数组的引用。但是,参数 brr 的类型为 int [9],您不能将未知边界数组的引用绑定到已知边界数组。


您有多种选择:

  1. 您可以将数组衰减为指针:
void reverse(int *arr, int n);

这确实意味着您需要将大小传递给函数,并且您必须确保您获得正确的大小,否则您可能会调用未定义的行为。

  1. 您可以使 arr 成为一个包含 9 个整数的数组的引用。
void reverse(int (&arr)[9]);

请注意,n 在这里毫无意义,因为大小是固定的,因此您可以删除第二个参数。这确实意味着您也可以使用大小为 9 的数组调用此函数。

  1. 我推荐的方法是制作reverse模板,并推断数组的大小。
template<int n>
void reverse(int (&arr)[n]);

这样做的好处是 n 可以变化,即这适用于任何大小的数组。此外,您不需要在调用函数时将大小传递给它,因为它会被推导。