游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2525|回复: 4

模板类的编译问题

[复制链接]

30

主题

227

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
发表于 2007-12-18 22:14:00 | 显示全部楼层 |阅读模式
刚学模板编程,有一个简单的程序,三个文件main.cpp,tt.h,tt.cpp
//main.cpp
#include   <iostream>   
#include   "tt.h"   

  int   main()   
  {   
  A<int> a;
  a.test(10);   
  return   0;   
  }   
//tt.h
#ifndef   TT_H   
  #define   TT_H   
   
  template<typename   T>   
  class A{
  public:
  void   test(T   val);  
  };
  #include   "tt.cpp"   
  #endif  
//tt.cpp
  template<typename   T>   
  void  A<T>::test(T   val)   
  {   
          std::cout   <<  val   <<   std::endl;   
  }   

编译错误:
1>e:\testtemp\testtemp\tt.cpp(4) : error C2143: 语法错误 : 缺少“;”(在“<”的前面)
1>e:\testtemp\testtemp\tt.cpp(4) : error C2182: “A”: 非法使用“void”类型
1>e:\testtemp\testtemp\tt.cpp(4) : error C2988: 不可识别的模板声明/定义
1>e:\testtemp\testtemp\tt.cpp(4) : error C2059: 语法错误 : “<”
1>e:\testtemp\testtemp\tt.cpp(4) : error C2039: “test”: 不是“`global namespace'”的成员


模板类需要看到类成员函数的定义,所以我把定义放在.h文件中,编译连接是通过的。
如果我把main.cpp中的#include 改为"tt.cpp",然后在tt.cpp中包含tt.h,编译连接也是通过的。

但是我使用了c++ primer中写的这个包含编译模型,却始终通不过编译。我想不明白的是,为什么tt.h中包含了tt.cpp的实现,为什么却有错呢。求高手给解释下,还有该怎么改。
我用的是VS2005。

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2007-12-18 23:28:00 | 显示全部楼层

Re:模板类的编译问题

因为编译器根据cpp这个后缀编译了tt.cpp这个文件,根据tt.cpp的代码,必然出现编译错误
对付模板类,没必要分开写

30

主题

227

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
 楼主| 发表于 2007-12-19 00:07:00 | 显示全部楼层

Re: 模板类的编译问题

问题解决了,只要在工程中不包含tt.cpp文件就可以了。
楼上说的对,实际上,编译的时候只要不编译tt.cpp,而仅仅是#include进去就是对的。

分开写为了清楚点,也可能是强迫症犯了……
[em7]

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
QQ
发表于 2007-12-19 08:22:00 | 显示全部楼层

Re:模板类的编译问题

LZ的代码编写风格真是不太好!!!建议你要好好改一下了。看你写的代码,真头晕!

30

主题

227

帖子

232

积分

中级会员

Rank: 3Rank: 3

积分
232
 楼主| 发表于 2007-12-19 12:23:00 | 显示全部楼层

Re:模板类的编译问题

这时ctrlV过来后的问题,实际的代码肯定有缩进的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-18 07:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表