如何解决推导出参数“_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]
,您不能将未知边界数组的引用绑定到已知边界数组。
您有多种选择:
- 您可以将数组衰减为指针:
void reverse(int *arr,int n);
这确实意味着您需要将大小传递给函数,并且必须确保大小正确,否则您可能会调用未定义的行为。
- 您可以将
arr
设为对 9 个整数数组的引用。
void reverse(int (&arr)[9]);
注意 n
在这里没有意义,因为大小是固定的,所以你可以去掉第二个参数。这确实意味着您也可以使用大小为 9 的数组调用此函数。
- 我推荐的方法是将
reverse
设为模板,并推导出数组的大小。
template<int n>
void reverse(int (&arr)[n]);
这具有 n
可以变化的优点,即这适用于任何大小的数组。此外,您不需要在调用函数时将大小传递给它,因为它是被推导出来的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。