CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一个关于摸板类的问题

楼主linxco()2005-06-01 18:56:33 在 C/C++ / C++ 语言 提问

类定义queue.h:    
  #include<iostream>  
  #include<string>  
   
  using   namespace   std;  
   
  class   Employee    
  {  
   
          public:  
          string   name;  
  int   NO;  
  Employee();  
          Employee(string,int);  
  friend   istream&   operator>>(istream   &is,Employee   &a);  
  friend   ostream&   operator<<(ostream   &os,Employee   &a);  
   
  };  
   
  Employee::Employee(string   s,int   i)  
  {  
  name=s;  
  NO=i;  
  }  
   
  Employee::Employee()  
  {  
  name="";  
  NO=0;  
  }  
   
  istream&   operator>>(istream   &is,Employee   &a)  
  {  
  is>>a.name;  
  is>>a.NO;  
  return   is;  
  }  
   
  ostream&   operator<<(ostream   &os,Employee   &a)  
  {  
  os<<a.name;  
  os<<a.NO;  
  return   os;  
  }  
  template   <typename   elemType>  
  class   queue  
  {  
          elemType   q;  
  struct   node  
  {  
  elemType   data;  
  struct   node   *link;  
  };  
  typedef   struct   node   NODE;  
  NODE   *head1,*tail1;  
          public:  
                  queue();  
                  void   enqueue(elemType);  
                  bool   empty();  
                  elemType   dequeue();  
  class   bad_op  
                  {  
                          public:  
                                  bad_op(int   i)   :type(i){}  
                                  int   type;  
                  };  
  };  
   
  template   <typename   elemType>  
  queue<elemType>::queue()  
  {  
  head1=NULL;  
  tail1=NULL;  
  }  
   
  template   <typename   elemType>  
  void   queue<elemType>::enqueue(elemType   a)  
  {  
  NODE   *p;  
  p=new   NODE;  
  p->data=a;  
  p->link=NULL;  
  if(head1==NULL)  
  head1=p;  
  else  
  tail1->link=p;  
  tail1=p;  
  }  
   
  template   <typename   elemType>  
  bool   queue<elemType>::empty()  
  {  
  if(head1==NULL)  
  return   true;  
  else  
  return   false;  
  }  
   
  template   <typename   elemType>  
  elemType   queue<elemType>::dequeue()  
  {  
  elemType   output;  
  NODE   *p;  
  output=head1->data;  
  p=head1;  
  head1=head1->link;  
  free(p);  
  return   output;  
  }  
  测试程序test.cpp:  
    //**************************************************************  
  //       test   template   queue                                               --             EX12  
  //**************************************************************  
   
  #include   <iostream>  
   
  using     std::cout;  
  using     std::cin;  
  using     std::cerr;  
  using     std::endl;  
   
  #include   "queue.h"  
   
   
  int   main()  
  {  
          while(true)  
          {  
                  cin.clear(std::ios::goodbit);     //   make   input   stream   noraml  
                   
                  cout   <<   endl<<   "Choice:   int   ,   char   ,   employee,   Quit   (I/C/E/Q)   :   ";  
                  char   c;  
                  cin   >>   c;  
                  if   (c=='Q'||c=='q')   break;  
           
                  if   (c=='I'||c=='i')     //   test   integer   queue  
                  try  
                  {  
                          queue<int>   iq;  
                           
                          cout   <<   "Enqueue:   ";      
                          for   (int   i=10000;   i<=10005;   i++)   //   enqueue   5   integers  
                          {       iq.enqueue(i);     cout   <<   i   <<   "       ";     }  
                          cout   <<   endl;  
                           
                          cout   <<   "Dequeue:   ";      
                          while   (!iq.empty())                               //   dequeue   5   integers  
                                  cout   <<   iq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
   
                          cout   <<   "enter   integer   to   enqueue:   ";    
                          int   c;  
                          while   (cin   >>   c)                                     //   enter   and   enqueue   arbitrary   integers  
                                  iq.enqueue(c);  
                          cout   <<   endl;  
   
                          cout   <<   "Dequeue:   ";                               //   dequeue   arbitrary   integers  
                          while   (!iq.empty())  
                                  cout   <<   iq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
                  }  
                  catch(queue<int>::bad_op   bi)  
                  {     cerr<<   bi.type   <<",   exit   "   <<   endl;     }  
           
                  else   if   (c=='C'||c=='c')     //   test   char   queue  
                  try  
                  {  
                          queue<char>   cq;  
                   
                          cout   <<   "Enqueue:   ";      
                          for   (char   i='A';i<='E';i++)  
                          {       cq.enqueue(i);     cout   <<   i   <<   "       ";     }  
                          cout   <<   endl;  
           
                          cout   <<   "Dequeue:   ";      
                          while   (!cq.empty())  
                                  cout   <<   cq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
   
                          cout   <<   "enter   character   to   enqueue:   ";  
                          char   c;  
                          while   (cin   >>   c)  
                                  cq.enqueue(c);  
                          cout   <<   endl;  
   
                          cout   <<   "Dequeue:   ";      
                          while   (!cq.empty())  
                                  cout   <<   cq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
                  }  
                  catch(queue<char>::bad_op   bi)  
                  {         cerr<<   bi.type   <<",   exit   "   <<   endl;         }  
             
                  else   if   (c=='E'||c=='e')           //   test   Employee   queue  
                  try  
                  {  
                          queue<Employee>   eq;  
                   
                          cout   <<   "Enqueue:   ";      
                          Employee   a("john",1001);  
                          Employee   b("bjarne   stroustrup",2001);  
                          eq.enqueue(a);       cout   <<   a   <<   "       ";  
                          eq.enqueue(b);       cout   <<   b   <<   "       ";  
                          cout   <<   endl;  
             
                          cout   <<   "Dequeue:   ";      
                          while   (!eq.empty())  
                                  cout   <<   eq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
   
                          cout   <<   "enter   employee   to   enqueue   (name   and   department):   ";  
                          Employee   c;  
                          while   (cin   >>   c)  
                                  eq.enqueue(c);  
                          cout   <<   endl;  
   
                          cout   <<   "Dequeue:   ";      
                          while   (!eq.empty())  
                                  cout   <<   eq.dequeue()   <<   "       ";  
                          cout   <<   endl;  
                  }  
                  catch(queue<Employee>::bad_op   bi)  
                  {       cerr<<   bi.type   <<",   exit   "   <<   endl;       }  
   
                  else   cout   <<   "Invalid   selection,   Retry!   "   <<endl;  
          }  
   
          return   0;  
  }  
  用vc调试,error   C2593:   'operator   <<'   is   ambiguous,不知道为什么。  
  问题点数:40、回复次数:7Top

1 楼sisuo0204()回复于 2005-06-01 19:26:07 得分 0

为什么不用.net编译以下那?Top

2 楼linxco()回复于 2005-06-01 19:27:43 得分 0

不会Top

3 楼whyglinux(山青水秀)回复于 2005-06-01 19:34:06 得分 30

VC6的老问题了。在class   Employee的定义前面加上如下声明语句试试:  
   
  class   Employee;  
  istream&   operator>>(istream   &is,Employee   &a);  
  ostream&   operator<<(ostream   &os,Employee   &a);  
   
  另外,做好把上述函数里面的参数Employee   &a改为const   Employee   &a。Top

4 楼linxco()回复于 2005-06-01 20:15:07 得分 0

whyglinux(山青水秀),谢谢你,成功了,不过还是想问问为什么会这样.Top

5 楼mostideal(三甲)回复于 2005-06-02 00:27:21 得分 0

学习。。。Top

6 楼zdy_8212(zdy_8212)回复于 2005-06-02 03:09:33 得分 10

二义性。主要是本对象一个重载操作与现有的操作相异同。所以Top

7 楼whyglinux(山青水秀)回复于 2005-06-02 09:55:46 得分 0

因为C++标准规定在类中对友元函数进行友元声明的时候,必须首先要对函数进行声明,否则程序是病态的。在这一点上,VC6的行为忠实地体现了标准的这一规定。  
   
  然而较新版本的C++编译器即使没有函数声明也是可以的。对于用户的使用上来说是显得方便了,但是显然不符合标准的规定。我对此比较困惑。Top

相关问题

  • VC.NET支不支持摸板的默认类型??
  • C++模板类
  • 类模板
  • 谁帮我用类摸板做一个求n!的程序,谢谢了
  • 模板类问题
  • 类模板问题
  • 类模板急救
  • 关于模板类?
  • 如何从类模板派生类?
  • string摸板类中有大小写不敏感的字符串比较方法吗?在线等待!

关键词

  • template
  • null
  • elemtype
  • queue
  • head1
  • istream
  • tail1
  • employee
  • std
  • ostream

得分解答快速导航

  • 帖主:linxco
  • whyglinux
  • zdy_8212

相关链接

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

广告也精彩

反馈

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