返回信息流c++primer中的538页的最下面的例子和572页的中间的那个compare(ch_arre1,cn_arre2)解释的是完全相反的 ,下面的两个图片为什么第一个对了,第二个就错了,都是数组啊???
求解释啊
这是一条镜像帖。来源:北邮人论坛 / cpp / #84690同步于 2014/12/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++primer中的538页的最下面的例子和572页的中间的那个compare
lfny
2014/12/9镜像同步17 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不该普通函数,就是为什么int型不能用在那个函数模板上
【 在 FromSixToTen 的大作中提到: 】
: 把函数定义改成这样:int compare(char *,char *)
你不能主观去掉我上面模板中的&符号啊,关键点就在这个符号上面,你还去掉了[em9]
【 在 FromSixToTen 的大作中提到: 】
: 写了一个例子,没有问题呀,不明白你说的什么意思。
: [upload=1][/upload]
重新编译就错了,就是我上面的那个图片
【 在 FromSixToTen 的大作中提到: 】
: 改成int compare(const Type& a,const Type& b)重新编译一下就行了。
别听楼上的。。。换gcc还是会告诉你编译错误。。不信你试试。
之所以编译错误是因为
int a[12], b[24];
a和b不是一个类型(为什么?自己查咯)
所以不能匹配模版函数 int compare(const T&, const T&)
然后编译器试图让你匹配普通函数 int compare(const char* , const char*)
然后就报出了你所述的错误。
【 在 lfny 的大作中提到: 】
: 重新编译就错了,就是我上面的那个图片
:
他的a,b长度是一样的所以不会错。。。
如果模板参数是引用类型,并且,调用时传入的是数组类型,就是你的a[10]和b[42],那不能产生新的实例化
原因是,compare(a,b)的两个实参类型不一致,一个是 int &[10],一个是int &[42]。所以第二个图是错的
那如果模板参数是非引用类型,对于compare(a,b)这样的调用,有两个选择:1,调用普通版本,2,T绑定到
int *的模板版本,但是你的例子中没有对应int *的普通版本,只能调用模板版本。
那个arr1和arr2也不是一个类型啊,怎么就行呢!这是问题的关键
【 在 buptxrc 的大作中提到: 】
: 别听楼上的。。。换gcc还是会告诉你编译错误。。不信你试试。
: 之所以编译错误是因为
: int a[12], b[24];
: ...................
那个arr1 和arr2也是不一样长的的啊,只不过ab是int型,arr1和2是字符型啊,没有其他的区别啊,为啥arr1和2就行呢
【 在 inaadversity 的大作中提到: 】
: 他的a,b长度是一样的所以不会错。。。
: 如果模板参数是引用类型,并且,调用时传入的是数组类型,就是你的a[10]和b[42],那不能产生新的实例化
: 原因是,compare(a,b)的两个实参类型不一致,一个是 int &[10],一个是int &[42]。所以第二个图是错的
: ...................
arr1和2用的是模板函数,不是普通函数,而且还能通过,但是ab就不行为啥
【 在 lfny 的大作中提到: 】
: 那个arr1 和arr2也是不一样长的的啊,只不过ab是int型,arr1和2是字符型啊,没有其他的区别啊,为啥arr1和2就行呢