模板函数的参数转换问题!

zgj828 2009-03-01 01:02:38
原理:如果行参是引用 编译器不会将数组实参转换为指针 而是按引用传递数组本身,这种情况下数组大小成为行参和实参的一部分,编译器会检查数组实参的大小是否与行参的大小匹配! 否则如果行参不是引用类型 则会对数组类型的实参转换成指针!

下面例子;

template<typename T> T test(const T&,const T&);
int a[10],b[20];
test(a,b)//这样就不对啦 行参数组大小不匹配!



再看下面例子

template<typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
compare(s1,s2);//书上说是正确的,我咋感觉不对啊,按我上面写的原理:s1 s2不能转换成指针啊 应该按实际的数组大小和行参做匹配 显然2者不匹配啊!
...全文
141 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgj828 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
引用 4 楼 zgj828 的回复:
引用 3 楼 hairetz 的回复:
引用 2 楼 zgj828 的回复:
引用 1 楼 arong1234 的回复:
为什么不匹配?s1,s2都是包含7个元素的char数组

我觉得要匹配的话应该这样写
template <typename T> int compare(const (T&)[7],const (T&)[7]);
行参数组大小和实参数组大小匹配啦!

template <typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
这样已经匹配…
[/Quote]
template<typename T> int compare(const T&,const T&);
char s1[7] ,s2[7];
compare(s1,s2);
这样能匹配吗?
zfvc1986911 2009-03-01
  • 打赏
  • 举报
回复


template<typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
compare(s1,s2);//书上说是正确的,我咋感觉不对啊,按我上面写的原理:s1 s2不能转换成指针啊 应该按实际的数组大小和行参做匹配 显然2者不匹配啊!

可以这样理解啊,T的类型为 char (*)[7];s1和s2是匹配的.
ayw215 2009-03-01
  • 打赏
  • 举报
回复
up
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zgj828 的回复:]
引用 3 楼 hairetz 的回复:
引用 2 楼 zgj828 的回复:
引用 1 楼 arong1234 的回复:
为什么不匹配?s1,s2都是包含7个元素的char数组

我觉得要匹配的话应该这样写
template <typename T> int compare(const (T&)[7],const (T&)[7]);
行参数组大小和实参数组大小匹配啦!

template <typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
这样已经匹配了,s1跟s2一样的长度就是匹配…
[/Quote]
还觉得不对吗?你把第一个改为a[10],b[10];
就搞定了,这样应该清楚了吧。
s79947171 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zgj828 的回复:]
引用 9 楼 normallife 的回复:
const T& 这个代表什么意思啊?怪怪的?你是不是将const &T 和const T&搞混了

const T& 引用啊!int a=10; int b&=a;
[/Quote]
const T& 引用啊!int a=10; int b&=a;我晕,引用是这么写的?那个老师教您的?
那 int a=10 ;int &b=a;算啥?
zgj828 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 normallife 的回复:]
const T& 这个代表什么意思啊?怪怪的?你是不是将const &T 和const T&搞混了
[/Quote]
const T& 引用啊!int a=10; int b&=a;
zgj828 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
引用 2 楼 zgj828 的回复:
引用 1 楼 arong1234 的回复:
为什么不匹配?s1,s2都是包含7个元素的char数组

我觉得要匹配的话应该这样写
template <typename T> int compare(const (T&)[7],const (T&)[7]);
行参数组大小和实参数组大小匹配啦!

template <typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
这样已经匹配了,s1跟s2一样的长度就是匹配。
写成const (T&)[7],这样…
[/Quote]
哦!糊涂啦,不过我老是觉得不对哦!
2个例子中的模板函数的行参是一样的!
为什么int a[10],b[20]; test(a,b) 这样传递 a b就不对呢?
而char s1[]="s11111" ,s2[]="s22222";compare(s1,s2); 就行呢?
按我的想法就是 a b s1 s2 这些都是指针啊!为什么a b可以传递 而s1 s2不能传递!
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgj828 的回复:]
引用 1 楼 arong1234 的回复:
为什么不匹配?s1,s2都是包含7个元素的char数组

我觉得要匹配的话应该这样写
template <typename T> int compare(const (T&)[7],const (T&)[7]);
行参数组大小和实参数组大小匹配啦!
[/Quote]
template<typename T> int compare(const T&,const T&);
char s1[]="s11111" ,s2[]="s22222";
这样已经匹配了,s1跟s2一样的长度就是匹配。
写成const (T&)[7],这样,你觉得还算模板吗。哪有这种写法。
zgj828 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 arong1234 的回复:]
为什么不匹配?s1,s2都是包含7个元素的char数组
[/Quote]
我觉得要匹配的话应该这样写
template<typename T> int compare(const (T&)[7],const (T&)[7]);
行参数组大小和实参数组大小匹配啦!
arong1234 2009-03-01
  • 打赏
  • 举报
回复
为什么不匹配?s1,s2都是包含7个元素的char数组
normallife 2009-03-01
  • 打赏
  • 举报
回复
const T& 这个代表什么意思啊?怪怪的?你是不是将const &T 和const T&搞混了

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧