推导出参数“_BIter”的冲突类型“int*”和“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 可以变化的优点,即这适用于任何大小的数组。此外,您不需要在调用函数时将大小传递给它,因为它是被推导出来的。