免费注册 查看新帖 |

Chinaunix

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

template内部strut的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-29 08:56 |只看该作者 |倒序浏览
环境:
MinGW
gcc 3.4.2

下边的问题让我比较纳闷,如果不是把strut写在template里,就可以正常使用。


这样写会报错:expect ';' before '*' token
  1. template<class T> class b;

  2. template<class T>
  3. class a {
  4.     struct link {
  5.         T* data;

  6.         link* next;
  7.         link(T* Data, link* Next) {
  8.             data = Data;
  9.             next = Next;
  10.         }
  11.     } * head;
  12. public:
  13.     a();
  14.     friend class b<T>;
  15. };

  16. template<class T>
  17. class b {
  18.     a <T>::link* p;
  19. };

  20. int main(void) {
  21.     return 0;
  22. }
复制代码



要把strut拿出来定义才可以正常使用
  1. template<class T> class b;

  2. template<class T>
  3. struct link {
  4.     T* data;
  5.     link<T>* next;
  6.     link(T* Data, link<T>* Next) {
  7.         data = Data;
  8.         next = Next;
  9.     }
  10. };

  11. template<class T>
  12. class a {
  13.     link<T>* head;
  14. public:
  15.     a();
  16.     friend class b<T>;

  17. };

  18. template<class T>
  19. class b {
  20.     link<T>* p;
  21. };

  22. int main(void) {
  23.     return 0;
  24. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-06-29 09:14 |只看该作者
俺也不懂,顶。。。。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2006-06-29 09:18 |只看该作者
把a <T>::link* p;
改成
typename a <T>::link* p;
试试。

论坛徽章:
0
4 [报告]
发表于 2006-06-29 09:51 |只看该作者
it works, but why????

论坛徽章:
0
5 [报告]
发表于 2006-06-29 12:43 |只看该作者
加上typename果然就好了,但是我更纳闷了,typename是什么意思呢?能不能指教一下?

论坛徽章:
0
6 [报告]
发表于 2006-06-29 12:56 |只看该作者
在网上找到的解释是这样的。

通用的规则很简单:在你涉及到一个在 template(模板)中的 nested dependent type name(嵌套依赖类型名)的任何时候,你必须把单词 typename 放在紧挨着它的前面。


那为什么typename只用在template上呢?如果我只写一个简单的class,即使里边是存在嵌套的类型,也不需要使用typename,相反的如果使用了typename,编译的时候还会报错。
  1. class b;

  2. class a {
  3.     struct link {
  4.         a* data;
  5.         link* next;
  6.         link(a* Data, link* Next) {
  7.             data = Data;
  8.             next = Next;
  9.         }
  10.     } * head;
  11. public:
  12.     a();
  13.     friend class b;
  14. };

  15. class b {
  16.     a::link* p;
  17. };

  18. int main(void) {
  19.     return 0;
  20. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2006-06-29 12:58 |只看该作者
原帖由 xyz20003 于 2006-6-29 12:43 发表
加上typename果然就好了,但是我更纳闷了,typename是什么意思呢?能不能指教一下?

看看《c ++ primer》吧。我也不是很明白。
应该是编译器把a当作一个变量了,所以它解析出错。
你用typename明确告诉编译器这是一个类型,
就不会出错了。
说实话,我看了你的标题,就想到了typename,
这或许是种直觉吧。

论坛徽章:
0
8 [报告]
发表于 2006-06-29 13:05 |只看该作者
谢谢,我回去再研读一下。。。

论坛徽章:
0
9 [报告]
发表于 2006-06-29 19:08 |只看该作者
a <T>::link* p;
两种解释:
1 link是类a的静态成员,这样这个语句就是一个乘法。
2 link是类a内部定义出来的一个类型。

不能不加区分。

论坛徽章:
0
10 [报告]
发表于 2006-06-29 22:44 |只看该作者
好贴!!!
看来我的C++基础仍需加强!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP