CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

template question 1

楼主tommy851027(努力,努力!)2006-03-03 18:50:51 在 C/C++ / C++ 语言 提问

为了分析模板定义,编译器必须能够区分出是类型以及不是类型的表达式。对于编译器来说,它并不总是能够区分出模板定义中的哪些表达式是类型。比如如果编译器在模板定义中遇到表达式R::name   ,且R   这个模板类型参数代表了一个类,那么name引用的是R的一个类型成员吗?编译器无法知道name是否为一个类型,因为它只有在模板被实例化之后才能找到R表示的是类的定义。  
  告诉编译器一个表达式是类型表达式的机制是在表达式前加上关键字typename   。  
   
   
  这句话我没看明白,到底是什么意思呢?最好举个例子,谢谢。 问题点数:20、回复次数:10Top

1 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-03 19:39:34 得分 0

 
  template<class   T>  
  class   test  
  {  
              public:  
              T::INT   kk;   //&sup2;&raquo;&Auml;&Uuml;&iquest;&Iuml;&para;¨INT&Ecirc;&Ccedil;&Agrave;à&ETH;&Iacute;&raquo;&sup1;&Ecirc;&Ccedil;±&auml;&Aacute;&iquest;    
              typename     T::INT   kk;   //&Ccedil;&iquest;&Ouml;&AElig;&Euml;&micro;&Atilde;÷&Ecirc;&Ccedil;&Agrave;à&ETH;&Iacute;   test<U>   obj1;&sup3;&ouml;&acute;í    
  };  
   
  class   T  
  {  
              public:  
              typedef   int   INT;  
   
  };  
   
  class   U  
  {  
              public:  
                            int   INT;  
  };  
  int   main()  
  {  
   
    test<T>   obj;  
    test<U>   obj1;  
    system("pause");  
  return   0;  
  }  
  Top

2 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-03 19:41:35 得分 10

template<class   T>  
  class   test  
  {  
              public:  
              T::INT   kk;   //不能确定INT是类型还是变量  
              typename     T::INT   kk;   //强制说明是类型   test<U>   obj1;出错  
  };  
  Top

3 楼cunsh(村少)回复于 2006-03-03 20:41:19 得分 10

class   T{  
  //...  
  public:  
  typedef   int   INT;  
  };  
   
  template<class   T>  
  class   test  
  {  
  public:  
              T::INT   *kk;   //如果你想让   kk   为整形指针.你可能这么写.  
  };  
   
   
   
  现在改一下class   T   .  
  class   T   {  
  public:  
      static   int   INT;  
  };  
   
  那在test类中你写的   T::INT   *kk;   就可能是一个乘法语句.    
   
  最后没办法.你只好拿出了typename这个关键字   告诉编译器   T::INT是个类型.Top

4 楼tommy851027(努力,努力!)回复于 2006-03-04 14:39:36 得分 0

没看明白Top

5 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-04 15:15:14 得分 0

因为模板是编译时已确定了参数类型,不是到运行时来确定.因此对于楼上给出的例子中:  
  T::INT   *kk;    
  //如果你想让   kk   为整形指针.你可能这么写.但是当你实例化为T时(test<T>   obj),却成了乘号.本来是做指针的,却成了乘号,肯定程序要出问题了噻,但是编译时又不一定会出错.  
  因此只好使用typename,这样可以强制申请它是一个类型.让编译器帮你发现错误(当你传入T为类型参数时)  
  Top

6 楼tommy851027(努力,努力!)回复于 2006-03-04 15:17:55 得分 0

有class   U   什么事啊?  
  各位大哥最好来个简单明了点的小例子。Top

7 楼xyjchinese(春天把老婆种到地下后我就急切的盼望秋天的到来)回复于 2006-03-04 15:35:21 得分 0

还有在T中已经typedef   int   INT;了,而在U中又int   INT;  
  这   int   INT;不是等同于   int   int;了吗,这是什么意思啊Top

8 楼tommy851027(努力,努力!)回复于 2006-03-04 15:37:56 得分 0

楼上的问题我也想知道Top

9 楼cxc014(有心插柳柳不活,无心栽花花开花?)回复于 2006-03-04 15:48:23 得分 0

这   int   INT;不是等同于   int   int;了吗  
  ======================================  
  T   和   U   是两个不同的类;  
  可能T类的设计者是把int定义为INT来用的,而U类的设计者又定义了个INT的变量.这是很有可能的吧.  
  其实我那个例子都还不能很明显的说明问题.  
  cunsh(村少)   (   )的例子就很明显了.原因我上面已经说过.加typename就是为了让编译器更加严谨些  
  test<T>   obj;时本来我们已经出错了,但是它没有发现(语法正常)Top

10 楼tommy851027(努力,努力!)回复于 2006-03-04 19:32:47 得分 0

不好意思啊,我还是不大清除,我再好好看看吧,我在网上找了半天也没找着一个完整的程序来解释这个。晕啊Top

相关问题

  • template question!!
  • template question 2
  • template question 3
  • template
  • about template
  • template与workspace
  • template function问题
  • template partial specialization
  • 奇怪的template!
  • non_template collection classes?

关键词

  • 编译器
  • 指针
  • 模板
  • template
  • 类型
  • 例子
  • 出错
  • 表达式
  • 参数
  • kk

得分解答快速导航

  • 帖主:tommy851027
  • cxc014
  • cunsh

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo