斜树的空间

集中精力,放弃一切的去做一件事情,只要尽力了,即使失败了,你也不会后悔!

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  47 随笔 :: 0 文章 :: 12 评论 :: 0 Trackbacks

晚上搞了半天才发现:原来类模板不能分文件写!
如:
template <class Type>
class TNumber
{
public:
 ~TNumber()
 {
 }

 void SetItem(Type);
 Type GetItem();
private:
 Type m_item;
};

写到casual.h中f。而实现文件写入casual.cpp中,那么在main文件中调用时就会提示外部命令无法解析的错误。
如:
1>main.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall TNumber<int>::GetItem(void)" (?GetItem@?$TNumber@H@@QAEHXZ),该符号在函数 _main 中被引用

看到一个解释是:
因为模板类在编译的时候就相当于宏定义,分两个文件是找不到的。

解决办法可以:
1.类模板定义和实现在同一文件。
2.在main文件中连续包含定义文件和实现文件.
#include "casual.h"
#include "casual.cpp"

int main()
{

 TNumber<int> obj1;

 cout << obj1.GetItem() << endl;

   return 0;
}

posted on 2010-04-22 01:01 张贵川 阅读(2651) 评论(7)  编辑 收藏 引用 所属分类: C++基础学习

评论

# re: C++模板类 2010-04-22 09:41 Davy.xu
模板就是一个在被引用时编译器检查语法的超级宏.   回复  更多评论
  

# re: C++模板类[未登录] 2010-04-22 22:23 codejie
一般的写法是在h文件的最后include CPP文件。例如,在cause.h的最后添加:
#ifdef __INLINE__
#include "cause.h"
#endif
毕竟在main文件中引用个CPP文件不好看。。。  回复  更多评论
  

# re: C++模板类[未登录] 2010-04-22 22:25 codejie
#ifdef __INLINE__
#include "cause.cpp"
#endif  回复  更多评论
  

# re: C++模板类 2010-04-25 23:43 张贵川
@codejie
这个到没想到,这写法好,谢谢了。  回复  更多评论
  

# re: C++模板类 2010-11-12 17:27 Tanky Woo
#ifdef __INLINE__
#include "cause.cpp"
#endif
这个方法的__INLINE__是怎么用?
我今天也遇到了。。。  回复  更多评论
  

# re: C++模板类 2010-11-12 17:34 Tanky Woo
在网上看了一个讨论帖,最后的结论还是:
对于模板类,老老实实的把接口与实现放在一个头文件中。  回复  更多评论
  

# re: C++模板类[未登录] 2011-10-30 11:19 jc
我不知道__INLINE__有什么用啊?
我觉得应该就是“casual_H”吧。
但这样有一个问题就是,在casual.cpp文件中会include头文件,
结果会造成循环引用。报错:
“包含文件太多 : 深度 = 1024”  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理