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

关于c++ primer中关于模板成员函数的疑问

楼主leonting()2006-02-22 23:02:57 在 C/C++ / C++ 语言 提问

看了两天还是没明白,参考essential   c++更晕了。  
   
  chap   16.3   类模板的成员函数:  
   
  被定义在类模板定义之外的成员函数必须使用特殊的语法,来指明它是一个类模板的成  
  员成员.函数定义的前面必须加上关键字template   以及模板参数.例如在类模板定义之外  
  可定义Queue   构造函数如下:  
  template   <class   Type>  
  class   Queue   {  
  public:  
  Queue(   );  
  private:  
  //   ...  
  };  
  template   <class   Type>  
  inline   Queue<Type>::  
  Queue(   )   {   front   =   back   =   0;   }  
  Queue   的第一次出现在域操作符::之前后面紧跟着模板参数表,这表示成员函数所属  
  的类模板.Queue   的第二次出现紧跟在域操作符之后表示构造函数的名字.它的名字可  
  以(但是不必)紧跟在模板参数表后面.  
   
  我被最后一句困住了,如何才能让queue()紧跟在模板参数表后面?  
  我试过类似   <class   Type>   Queue(),<Type>Queue(),编译都不能通过,不知道如何才能实现  
  这个"不必紧跟在模板参数表后面"的实现?能否给出code   scriptlet?  
   
   
   
  问题点数:100、回复次数:9Top

1 楼leonting()回复于 2006-02-23 00:09:43 得分 0

下了原版看了看,似乎是翻译问题。  
   
  不必紧跟在模板参数表后面:对应  
  Its   name   may   but   does   not   need   to   be   followed   by   the  
  template   parameter   list.  
  那就应该是:也许可以但不必要跟模板参数表在后面。  
  同样我试过Queue<T>(),也是不行的。  
  不知道是不是我的领悟能力的问题,我只能理解模板成员函数只有  
  template   <class   Type>  
  inline   Queue<Type>::  
  Queue(   )   {   front   =   back   =   0;   }  
  这样一种写法。  
   
  请指点我,万分感谢!Top

2 楼missedyou_1984(执著)回复于 2006-02-23 17:59:20 得分 1

不才呀  
  建议你看一下  
  STL  
  Top

3 楼xzgyb(老达摩)回复于 2006-02-24 09:28:20 得分 25

就是说你也可以这样写,但是不必要  
  template   <class   Type>  
  inline   Queue<Type>::  
  Queue<Type>(   )   {   front   =   back   =   0;   }  
   
  Top

4 楼ugg(逸学堂(exuetang.net))回复于 2006-02-24 09:48:14 得分 35

template<class   T>  
  class   AA  
  {  
  public:  
  AA();  
  };  
   
  template<class   T>  
  AA<T>::AA<T>()//   注意有两个AA<T>  
  {  
  }  
  //   编译成功  
   
  template<class   T>  
  class   AA  
  {  
  public:  
  AA();  
  };  
   
  template<class   T>  
  AA<T>::AA()//   注意  
  {  
  }  
  也编译成功。  
   
  区别就是上面的理解Top

5 楼ox_thedarkness()回复于 2006-02-24 10:01:14 得分 9

同上,后面一句翻反了....   楼主看原版罢  
   
  The   first   occurrence   of   Queue(the   one   preceding   the   scope   operator   ::)is   followed   by   the   template   parameter   list.   This   represents   the   class   template   to   which   the   member   function   belongs.   The   second   occurrence   of   Queue   in   the   constructor   definition(the   one   following   the   scope   operator)   represents   the   name   of   the   constructor   member   function.   Its   name   may   but   does   not   need   to   be   followed   by   the   template   parameter   list.  
   
  第二个Queue(在作用域符号后面的那个)是构造函数这个成员函数的名称。它的名字后面可以跟模板参数表,但这不是必须的。Top

6 楼leonting()回复于 2006-02-24 10:57:27 得分 0

谢谢各位回复,确定了我的理解,但是我还是有疑问。请看代码:  
  //----------------listtmp.h---------------------------------  
  #   include<iostream.h>  
   
  template    
  <class   T>   //   类型形式参数表  
  class    
  List     //className  
  {  
  public:  
  List();  
  void   Add(T&);  
  void   Remove(T&);  
  T*   Find(T&);  
  void   PrintList();  
  ~List();  
   
  protected:  
  struct   Node{  
  Node*   pNext;  
  T*   pT;  
  };  
  Node*   pFirst;  
  };  
   
  template  
  <class   T>   //类型形式参数表  
  List   //className  
  <T> //类型名表  
  ::List()  
  {  
  pFirst   =   0;  
  }  
   
  template<class   T>   void   List<T>   ::   Add(T&   t){  
  Node*   temp   =   new   Node;     //1  
  temp   ->   pT   =   &t; //2  
  temp->pNext   =   pFirst; //3  
  pFirst   =   temp; //4  
  }  
   
  template<class   T>   void   List<T>::Remove(T&   t){  
  Node*   q   =   0;   //用来定位待删结点  
  if(*(pFirst->pT)   ==   t){  
  q   =   pFirst;  
  pFirst   =   pFirst   ->   pNext;  
  }  
  else{  
  for(Node*   p=pFirst;   p->pNext;   p=p->pNext){  
  if(*(p->pNext->pT)   ==   t){  
  q   =   p->pNext;  
  p->pNext   =   q->pNext;   //5  
  break;  
  }  
  }  
  }  
  if(q){  
  delete   q->pT;   //6  
  delete   q;     //7  
   
  }  
  }  
   
  template<class   T>   T*   List<T>::Find(T&   t){  
  for(Node*   p=pFirst;   p;   p=p->pNext){  
  if(*(p->pT)   ==   t)  
  return   p->pT;  
  }  
  return   0;  
  }  
   
  template<class   T>   void   List<T>::PrintList(){  
  for(Node*   p=pFirst;   p;   p=p->pNext){  
  cout<<*(p->pT)<<"   ";  
  }  
  cout<<endl;  
  }  
   
  template<class   T>   List<T>::~List(){  
  Node*   p;  
  while(p   =   pFirst){  
  pFirst   =   pFirst->pNext;  
  delete   p->pT;  
  delete   p;  
  }  
  }  
  //------------------------------------------------------------  
   
  我修改Add函数,使其成为Add<T>形式,vc6中编译不能通过,这是为什么呢?  
   
   
  Top

7 楼xzgyb(老达摩)回复于 2006-02-24 11:08:39 得分 30

Add是一个普通的成员函数,没有这种Add<T>的写法  
  它不同于构照函数  
   
  它不同于构照函数和析构函数  
  构照函数和析构函数由于必须用这个类名来命名  
  所以如果严格说来模板中的构造和析购函数都要加上<T>  
  如  
  template   <class   T>  
  class   A    
  {  
  public:  
          A<T>()   {}  
          ~A<T>()   {}  
  };  
   
  c++提供了这种方便,可以不用加  
   
  但普通的成员函数则不应该加了Top

8 楼leonting()回复于 2006-02-24 11:11:14 得分 0

上面一段代码修改list()为list<T>(),编译通过。  
  修改template<class   T>   void   List<T>   ::   Add(T&   t)为template<class   T>   void   List<T>   ::   Add<T>(T&   t),编译报错。  
  是否c++primer中这段解释只对构造函数起作用呢?Top

9 楼leonting()回复于 2006-02-24 11:12:40 得分 0

谢谢老达摩,恢复比我提问还快。让我彻底理解了!Top

相关问题

  • 《C++Primer》函数模板习题的问题(100分)
  • 50分求解c++ primer中函数模板的问题
  • 初学者问题:C++函数模板
  • C++中函数模板和函数重载的关系
  • 模板函数
  • 函数模板
  • C++中如何在类外定义模板类内的模板函数?
  • C++模板判断函数是否被定义
  • C++类模板是否支持内联函数啊?
  • 在Dev-c++中,函数模板不支持偏特化?

关键词

  • c++
  • 函数
  • 模板
  • template
  • 编译
  • 修改
  • pfirst
  • pnext
  • queue
  • 成员

得分解答快速导航

  • 帖主:leonting
  • missedyou_1984
  • xzgyb
  • ugg
  • ox_thedarkness
  • xzgyb

相关链接

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

广告也精彩

反馈

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