免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: lyrix_z
打印 上一主题 下一主题

[C++] 一个C++模板的问题,VC6.0通过, GCC不能通过!! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-03-20 15:54 |只看该作者
原帖由 lenovo 于 2006-3-20 15:52 发表
其实我也不懂,看到报错了,
就加上试试。


确实是把waring解决了,我下班了再看看typename的用法

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2006-03-20 16:20 |只看该作者
原帖由 converse 于 2006-3-20 15:54 发表


确实是把waring解决了,我下班了再看看typename的用法

我看了下书,好像是在模板定义中,
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。

论坛徽章:
0
13 [报告]
发表于 2006-03-20 16:32 |只看该作者
原帖由 lenovo 于 2006-3-20 16:20 发表

我看了下书,好像是在模板定义中,
编译器不知道list<T*>::iterator是代表一个类型
还是代表list<T*>类中的一个成员,叫做iterator。


恩,我明白了,我原本不用加typename的时候是在非模板的情况下面没有出过警告,比如:


  1. #include <iostream>
  2. #include <list>

  3. int main()
  4. {
  5.     int array[9] = {0};
  6.     std::list<int> list(array, array + 9);

  7.     std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
  8.     for (; iter1 != iter2; iter1++)
  9.     {
  10.         std::cout << *iter1 << std::endl;
  11.     }

  12.     return 0;
  13. }
复制代码

论坛徽章:
0
14 [报告]
发表于 2006-03-21 17:55 |只看该作者
我把typename在模板中的用法看了一看,是这样的:

当我这样使用:

  1. #include <iostream>
  2. #include <list>

  3. int main()
  4. {
  5.     int array[9] = {0};
  6.     std::list<int> list(array, array + 9);

  7.     std::list<int>::iterator iter1 = list.begin(), iter2 = list.end();
  8.     for (; iter1 != iter2; iter1++)
  9.     {
  10.         std::cout << *iter1 << std::endl;
  11.     }

  12.     return 0;
  13. }
复制代码

这个时候,模板已经被实例化为int类型的,这个实力中有一个类型iterator.OK,这个没有问题,没有警告直接通过.

但是,如果是这样写:
std::list<T>::iterator,编译器到实例化之前不知道具体实例化的哪个实例,假设有可能std::list<char>类型中正好有一个静态成员是iterator,那么这个就是错误的.
为了明确的告诉编译器iterator,是一个类型而不是成员的名字,我们需要在前面加上typename.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP