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

请教:在VC中使用类模板,需要如何设置编译器才能编译通过?

楼主ah__fu(阿福)2005-04-03 15:39:26 在 VC/MFC / 基础类 提问

大家好:  
        小弟尝试着写一个类模板,但是出现很多编译问题,在此向大家请教。  
   
  我首先定义了一个类模板:  
  //file:   MyClass.h  
  template   <class   MyType>  
  class   MyClass  
  {  
  public:  
          MyClass();     //默认构造函数  
          MyClass(int   value);     //另外一个构造函数  
          ~MyClass();     //析构函数  
          void   Add(MyType   value);     //其中一个方法  
  private:  
          MyClass(const   MyClass&   lhs);     //复制构造函数  
          MyClass&   operator=(const   MyClass&   lhs);     //赋值函数  
          //其他部分省略,主要不是逻辑问题,而是编译问题  
  };  
   
  //file:MyClass.cpp  
  #include   "MyClass.h"  
   
  template   <class   MyType>  
  MyClass<MyType>::MyClass()     //默认构造函数  
  {  
          //代码省略  
  }  
   
  template   <class   MyType>  
  MyClass<MyType>::MyClass(int   value)     //构造函数  
  {  
          //代码省略  
  }  
   
  template   <class   MyType>  
  void   MyClass<MyType>::Add(MyType   value)     //其中一个方法  
  {  
          //代码省略  
  }  
   
  template   <class   MyType>  
  MyClass<MyType>::~MyClass()     //析构函数  
  {  
          //代码省略  
  }  
   
  //=========================================  
  我单独编译MyClass.cpp,可以通过  
  cl.exe   MyClass.cpp  
   
  然后,我测试这个类,结果编译不过  
  //file:   main.cpp  
  #include   <stdio.h>  
  #include   "MyClass.h"  
   
  int   main()  
  {  
          MyClass<char>   objTest(1);     //使用其中一个构造函数  
          return   1;  
  }  
   
  结果显示:  
  error   LNK2001:   unresolved   external   symbol  
  提示说MyClass(int   value)和~MyClass()这两个成员有问题。  
   
  好,我改为调用另一个构造函数:  
  MyClass<char>   objTest();  
  编译通过。  
   
  然后,我添加语句,调用方法:  
  objTest.Add('a');  
  结果又编译错误:  
  error   C2228:   left   of   '.Add'   must   have   class/struct/union   type  
   
   
  天哪,我简直要疯了!  
  请朋友们指教,我到底错在哪里!  
  我在MFC的窗口程序中包含这个类,也要出现编译错误!  
   
  谢谢大家! 问题点数:100、回复次数:15Top

1 楼jronald(深白色)回复于 2005-04-03 16:35:06 得分 0

我在vs.net2003下build也通不过,好像MyClass.cpp与main.cpp中成员函数的名字改编方式不一样  
  Linking...  
  main.obj   :   error   LNK2019:   unresolved   external   symbol   "public:   __thiscall   MyClass<char>::~MyClass<char>(void)"   (??1?$MyClass@D@@QAE@XZ)   referenced   in   function   _main  
  main.obj   :   error   LNK2019:   unresolved   external   symbol   "public:   __thiscall   MyClass<char>::MyClass<char>(void)"   (??0?$MyClass@D@@QAE@XZ)   referenced   in   function   _main  
  Top

2 楼Mackz(在相互)回复于 2005-04-03 16:43:28 得分 0

写得不对吧。Top

3 楼jronald(深白色)回复于 2005-04-03 16:58:53 得分 0

终于找到了  
  用模板时,要分离定义与实现用export关键字,这是c++标准说的,如  
  export   template   <class   MyType>  
  class   MyClass  
  {  
  public:  
          MyClass();     //默认构造函数  
          MyClass(int   value);     //另外一个构造函数  
          ~MyClass();     //析构函数  
          void   Add(MyType   value);     //其中一个方法  
  private:  
          MyClass(const   MyClass&   lhs);     //复制构造函数  
          MyClass&   operator=(const   MyClass&   lhs);     //赋值函数  
          //其他部分省略,主要不是逻辑问题,而是编译问题  
  };  
  但是vc编译器不支持这个标准  
  所以只好把实现也写在.h文件中Top

4 楼nonocast(如果没有如果)回复于 2005-04-03 16:59:36 得分 0

VC6本身就支持模板滴  
  只是不是很好  
  不过你上面的错误应该和VC无关Top

5 楼ah__fu(阿福)回复于 2005-04-03 17:56:36 得分 0

jronald(深白色)   兄  
  我把实现写在一个文件里面了,还是通不过啊!  
  请朋友们帮帮忙啊,难道VC里面你们都不用类模板的吗?Top

6 楼jronald(深白色)回复于 2005-04-03 18:03:16 得分 0

我通过了Top

7 楼jronald(深白色)回复于 2005-04-03 18:04:39 得分 0

贴出来看看Top

8 楼jronald(深白色)回复于 2005-04-03 19:34:53 得分 0

不信看我的  
  //file:   MyClass.h  
  template<class   MyType>  
  class   MyClass  
  {  
  public:  
  MyClass();  
  MyClass(MyType   value);     //另外一个构造函数  
  ~MyClass();  
  void   Add1(MyType   value);     //其中一个方法  
  protected:  
  private:  
  //MyClass(const   MyClass&   lhs);     //复制构造函数  
  //MyClass&   operator=(const   MyClass&   lhs);     //赋值函数  
  //其他部分省略,主要不是逻辑问题,而是编译问题  
  };  
   
   
  //file:MyClass.cpp  
  //#include   "MyClass.h"  
   
  template<class   MyType>   MyClass<MyType>::MyClass()     //默认构造函数  
  {  
  //代码省略  
  }  
   
  template<class   MyType>   MyClass<MyType>::MyClass(MyType   value)     //构造函数  
  {  
  //代码省略  
  }  
   
  template<class   MyType>   void   MyClass<MyType>::Add1(MyType   value)     //其中一个方法  
  {  
  //代码省略  
  }  
   
  template<class   MyType>   MyClass<MyType>::~MyClass()     //析构函数  
  {  
  //代码省略  
  }  
   
  //file:   main.cpp  
  //#include   <stdio.h>  
  #include   "MyClass.h"  
   
  int   main()  
  {  
  MyClass<char>   objTest(1);     //使用其中一个构造函数  
  return   0;  
  }Top

9 楼ah__fu(阿福)回复于 2005-04-03 23:43:40 得分 0

jronald(深白色)兄,你在定义对象后加一句:  
  objTest.Add1(123);  
   
  又会出问题了Top

10 楼jronald(深白色)回复于 2005-04-04 11:11:01 得分 0

加了,没错啊  
  我用vs.net2003编译的Top

11 楼ah__fu(阿福)回复于 2005-04-04 16:30:39 得分 0

我在VS.NET2003下面编译还是出问题啊  
  朋友们,再帮帮忙了!这个问题还是没有解决了  
  最好能够写出CL.EXE的命令行编译方式Top

12 楼jronald(深白色)回复于 2005-04-04 16:40:37 得分 0

把代码贴出来吧Top

13 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-04-04 18:22:03 得分 0

vs对于模板的支持比vc好多了Top

14 楼Practise_Think(时代“过客”)回复于 2005-04-04 19:26:13 得分 100

类模板的代码必须要写在同一个H文件中,不然的话编译不通过Top

15 楼erben(于丹&易中天)回复于 2005-04-04 21:47:24 得分 0

星星不要用了两天VS就看不起VC,你仔细看楼主的代码了   吗  
  ------------------  
    回复人:   oyljerry(【勇敢的心】→   ㊣Warm   up,A   za!㊣)   (   )   信誉:120     2005-04-04   18:22:00     得分:   0      
     
     
        vs对于模板的支持比vc好多了  
       
     
  Top

相关问题

  • vc++编译器的问题
  • VC编译器的问题
  • VC++6.0编译器问题.......
  • vc编译器死机
  • VC编译器的提问
  • MIB编译器!
  • java编译器
  • java编译器
  • c编译器
  • jsp编译器

关键词

  • vs.net
  • 函数
  • 编译
  • 模板
  • 代码
  • cpp
  • template
  • 逻辑
  • vs
  • 文件

得分解答快速导航

  • 帖主:ah__fu
  • Practise_Think

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

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