免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2094 | 回复: 5
打印 上一主题 下一主题

[C++] 问一个模板问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-19 23:56 |只看该作者 |倒序浏览
自己c++不是很好,有一个问题,
在写模板函数的时候
例如:
template<typename C>
void test(basic_string<C>& s) {
   
    typename basic_string<C>::iterator p;   // 这里前面要申明 typename
    basic_string<C>::size_type p1;              // 这里不需要声明 typename

}

这是为什么啊?
在模板函数里面什么时候要用typename 申明呢?

论坛徽章:
0
2 [报告]
发表于 2008-08-20 09:29 |只看该作者
这里都需要typename来声明使用的是类型
在使用了有依赖名的类型的内嵌类型时都需要typename声明,如这里的basic_string<C>类型依赖于模板参数C,因此它的内嵌类型需要typename声明

论坛徽章:
0
3 [报告]
发表于 2008-08-20 09:32 |只看该作者
我想知道的是
basic_string<C>::size_type
为什么不需要?

论坛徽章:
0
4 [报告]
发表于 2008-08-20 09:40 |只看该作者
对于本题的这两种写法,意思是一样的,只是第二种应该不标准而已,有的编译器能够通过, 正常情况内部类型前应该加typename修饰, 不然有时会将size_type当作一个静态成员变量,具体最好参考一下c++ template chapter 5 & 9

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2008-08-20 10:25 |只看该作者
编译器分析模板定义时需要区分类型和表达式,对于你这个例子,两个都不加typename也可以,因为basic_string<T>::iterator和basic_string<T>::size_type都是两个类型,但是如果有T::name * p这种声明,在模板实例化之前,编译器有时很难确定它是乘法表达式还是指针声明,所以加typename会指导编译器更有效的分析模板定义。
   当然这些都是编译时确定的,理论上不加typename,在实例化之后也能确定具体含义,不同的编译器会有不同的限制,实现时不会完全按照理论来。不过作为一个好习惯或者编译的优化方法,还是适当的加typename,就像const的用法一样,多数时候不加也能工作,但是它会传到一些积极的信息

论坛徽章:
0
6 [报告]
发表于 2008-08-21 00:05 |只看该作者
晓得了,谢谢大家的热情答疑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP