CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

int& 定义的变量的类型却是 int

楼主cxjddd(又是花开时)2004-04-01 00:03:05 在 C/C++ / C++ 语言 提问

听几个高人讨论,写这个程序:  
  template   <typename   T,   typename   C>  
  struct   CompilerTypeCheck  
  {  
  };  
   
  template   <typename   T>  
  struct   CompilerTypeCheck<T,   T>  
  {  
      typedef   T   value_type;  
  };  
   
  template   <typename   T,   typename   C>  
  void  
  VarTypeCheckFunction   (C   c)  
  {  
      typename   CompilerTypeCheck<T,   C>::value_type   t   =   c;  
  }  
   
  template   <typename   T>  
  struct   CheckType  
  {  
      template   <typename   C>  
      CheckType   (C   c)  
      {  
          T   t   =   c;  
          VarTypeCheckFunction<T>(t);  
      }  
  };  
   
  int  
  main   ()  
  {  
      CheckType<int>   i(0);  
      CheckType<int&>   r(0);   //   编译错误  
  } 问题点数:20、回复次数:16Top

1 楼smallbull(黑牛)回复于 2004-04-01 00:26:12 得分 2

int&什么意思,引用吗?好像不能在此使用吧,你是不是要CheckType<int*>   r(0);Top

2 楼againli(again)回复于 2004-04-01 01:09:47 得分 2

楼上能解释一下吗?!  
  1.//模板偏特化,为什么模板参数不一致?!  
  template   <typename   T,   typename   C>  
  struct   CompilerTypeCheck  
  {  
  };  
   
  template   <typename   T>  
  struct   CompilerTypeCheck<T,   T>  
  {  
      typedef   T   value_type;  
  };  
  2.   typename   CompilerTypeCheck<T,   C>::value_type   t   =   c;  
   
  //调用的时候被解释为第一个模板函数,但是其中不含有value_type啊?,用c这个变量给类别负值?  
  3.   VarTypeCheckFunction<T>(t);  
  //这句语法实在看不懂,指教  
  Top

3 楼againli(again)回复于 2004-04-01 01:10:12 得分 0

我最近也在看模板,望高手指教Top

4 楼againli(again)回复于 2004-04-01 01:11:51 得分 0

vc6.0可能很多性能不支持,搂主误怪,呵呵,Top

5 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-01 09:09:01 得分 5

这点毫无争论  
  CheckType<int&>   r(0);  
  指定的CheckType模板参数是int&,而0确是int  
  所以  
  template   <T=int&,C=int>     //伪码  
  CheckType<T>::CheckType(C)  
  接着  
  VarTypeCheckFunction<T>(t);   //t的类型是C  
  接着  
  typename   CompilerTypeCheck<T,   C>::value_type   t   =   c;   //没有匹配CompilerTypeCheck的偏特化版本  
  而是匹配的  
  template   <typename   T,   typename   C>  
  struct   CompilerTypeCheck  
  {  
  };    
  这里面没有typedef   T   value_type,所以编译到typename   CompilerTypeCheck<T,   C>::value_type   t   =   c;出错Top

6 楼cxjddd(又是花开时)回复于 2004-04-01 12:59:07 得分 0

to   againli(again):  
  2、typename   CompilerTypeCheck<T,   C>::value_type   里的   T   和   C   并不与前面的一样,编译器会根据实际类型来选择的。实际上,T、C   完全可能是同一类型。  
   
  3、VarTypeCheckFunction   有两个类型参数,由于通过参数   c   可以确定类型   C,所以只需给定类型   T。写起来就象   VarTypeCheckFunction<T>(c)。也可以写完整:VarTypeCheckFunction<T,   C>(c)。Top

7 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2004-04-01 14:37:03 得分 2

mark先!看到模板就头痛!Top

8 楼againli(again)回复于 2004-04-01 15:12:14 得分 2

呵呵,我想的和辣子高人有点类似  
  但是对于模板使用还有一些问题。  
  1。  
    template   <typename   T>     //这里不应该是template<typename   T,typename   C>吗~?  
  struct   CompilerTypeCheck<T,   T>  
  {  
      typedef   T   value_type;  
  };  
  2。  
  VarTypeCheckFunction<T>(t);   //为什么一定要如此声明,不应该是  
  //VarTypeCheckFunction(t);吗?难道函数模板也可以如此?  
   
  在请教Top

9 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-01 15:29:55 得分 2

template   <typename   T>     //这里不应该是template<typename   T,typename   C>吗~?  
  struct   CompilerTypeCheck<T,   T>  
  {  
      typedef   T   value_type;  
  };  
  这是CompilerTypeCheck的偏特化版,就是针对两个类型一样时  
  =========================================================  
  如果VarTypeCheckFunction(t);   就错了,因为VarTypeCheckFunction的typename   T不知道为何物  
  只有    
  VarTypeCheckFunction<T>(t);  
                                            ^   这样才能告诉编译器T是什么,这里的T就是CheckType的TTop

10 楼againli(again)回复于 2004-04-01 19:09:40 得分 1

这是CompilerTypeCheck的偏特化版,就是针对两个类型一样时  
   
  -->模板偏特化我是知道的,但是在偏特化的时候,是不是模板可以不一致,  
  template<typename   T,typename   C>     可以换成     template   <typename   T>   或者这样说,我随便声明模板  
  template<class   T,class   V,   class   Z,   class   M>//这里可以随便声明吗?  
  struct   CompilerTypeCheck<V,   V>  
  {  
      typedef   T   value_type;  
  };  
  Top

11 楼againli(again)回复于 2004-04-01 19:16:53 得分 1

如果VarTypeCheckFunction(t);   就错了,因为VarTypeCheckFunction的typename   T不知道为何物  
  只有    
  VarTypeCheckFunction<T>(t);  
                                            ^   这样才能告诉编译器T是什么,这里的T就是CheckType的T  
   
  --〉通俗一点理解是不是这样,因为参数推演只能推出一个参数(C),所以函数调用的时候  
  还需要再加上一个莫板参数,那是不是如果莫板函数定义成  
  template   <typename   T,   typename   C,   typename   TT>  
  void   VarTypeCheckFunction   (C   c)  
  {  
      typename   CompilerTypeCheck<T,   C>::value_type   t   =   c;  
  }  
   
  函数调用的时候就要     VarTypeCheckFunction<T,   TT>(t);//假设TT存在  
   
  问题比较多,呵呵  
   
  Top

12 楼xrdlm(t)回复于 2004-04-01 21:28:07 得分 1

是引用啊Top

13 楼cxjddd(又是花开时)回复于 2004-04-02 19:52:55 得分 0

template<class   T,class   V,   class   Z,   class   M>//这里可以随便声明吗?  
  struct   CompilerTypeCheck<V,   V>  
  {  
      typedef   T   value_type;  
  };  
  这个特化在   GCC3.2   里编译是不通过的。看了出错提示,我觉得,特化时列出的所有参数,必须可以恰好转换成原参数。如   <T>   可以转换成   <T,   T>。或者如  
  template<class   T,   class   V,   class   Z>  
  struct   CompilerTypeCheck<T,   std::pair<V,   Z>   >  
  {  
  };  
  通过   <T,   V,   Z>   转换成了   <T,   std::pair<V,   Z>   >,这是可以的。Top

14 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-03 15:08:37 得分 0

这个错误就是,特化版本指定的模板参数个数与泛化版本的不同Top

15 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-04-04 10:12:47 得分 2

一个引用其实在使用上一直被认为是该引用的原型,例如  
  int   i;  
  int&   r=i;  
  在使用上r完全是一个int。甚至用typinfo::name()得出来的信息也是int,所以这里有些细微的东西容易被忽略  
  template<typename   T>  
  void   fun(T);  
   
  fun(r);   //把r传递给函数模板fun,那推导出的T到底是int还是int&?其实是int  
  如果要让T成为int&,那么在实例化时就应该指定模板参数  
  fun<int&>(r);    
  Top

16 楼cxjddd(又是花开时)回复于 2004-04-04 16:23:12 得分 0

哈哈,说得太好了:)Top

相关问题

  • 在vc中不能将const int *所定义的变量返回给int *类型的变量吗?
  • 关于自定义变量类型
  • 如何定义变量类型?
  • ResultSet定义变量的类型怎么转化为int型?请指教
  • 能不能定义一个变量类型为listview的变量??
  • 在vb中有无将同一类型的变量用一句话定义,如象c中int a,b,c;
  • VB有指针类型吗?String(变量,"")定义的是什么变量?
  • 变量定义!
  • 定义变量
  • 变量定义

关键词

  • 模板
  • 函数
  • template
  • 编译器
  • 转换
  • 版本
  • compilertypecheck
  • vartypecheckfunction
  • 特化
  • checktype

得分解答快速导航

  • 帖主:cxjddd
  • smallbull
  • againli
  • Jinhao
  • sharkhuang
  • againli
  • Jinhao
  • againli
  • againli
  • xrdlm
  • Jinhao

相关链接

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

广告也精彩

反馈

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