返回信息流template<class T>
void Insert(T a[],int n,const T& x)
{
int i;
for(i=n-1;i>=0&&a[i]>x;--i)
a[i+1]=a[i];
a[i+1]=x;
}
template<class T>
void InsertSort(T a[],int n)
{
for(int i=1;i<n;++i) //sort a[0:n-1]
{
Insert(a,i,a[i]); //error *******************
}
}
插入排序,为什么Insert的x为引用形参时,不能使用a[i]作为其实参呢(即**号那行)?
Insert(a,i,a[i]);
改成
T t=a[i];
Insert(a,i,t);
就正确
这是一条镜像帖。来源:北邮人论坛 / cpp / #14338同步于 2008/10/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求教】数组元素做实参的问题
allen0308
2008/10/19镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
可以吧,应该你其它地方有问题吧
【 在 allen0308 的大作中提到: 】
: template<class T>
: void Insert(T a[],int n,const T& x)
: {
: ...................
这样排序后可以运行
但是结果不正确
Insert(a,i,a[i]);
改成
T t=a[i];
Insert(a,i,t);
就正确
【 在 taps 的大作中提到: 】
: 可以吧,应该你其它地方有问题吧
在insert函数的循环里,悄悄把传入的a[i]的值改了。在这里const 加 引用并没能起到保护a[i]值不被改变的作用。原因是const 加 引用只能保护x的值不被改变,试试 x = 1 这句,肯定会报错。其实数组元素是可以用作引用行参的实参的。只是在lz这里没有通过直接修改x的值,而是不自觉的通过其他途径修改的(a[i+1]=a[i]),这样const没起到预期的作用了。