类模板不能让声明和实现分离

写模板类的时候出的问题,调了一晚上,就是链接出错,于是搜索引擎开始工作,搜到篇简单的博文解释,暂时做个标记吧

原文地址:http://blog.youkuaiyun.com/hgy413/article/details/6441602

我们习惯是.h中放类的函数声明,在.cpp中放类的函数定义,但在类模板中不能这样做,如随手写了个demo测试了下

.h中代码

[cpp]  view plain copy
  1. #pragma once  
  2. template <class T>  
  3. class CTemplate  
  4. {  
  5. public:  
  6.     CTemplate(void);  
  7.     ~CTemplate(void);  
  8.     void Fun(T a) ;  
  9. };  

.cpp中代码

[cpp]  view plain copy
  1. #include "StdAfx.h"  
  2. #include "Template.h"  
  3. template<class T>  
  4. CTemplate<T>::CTemplate(void)  
  5. {  
  6. }  
  7. template<class T>  
  8. CTemplate<T>::~CTemplate(void)  
  9. {  
  10. }  
  11. template<class T>  
  12. void CTemplate<T>::Fun(T a)  
  13. {  
  14.     int b = a;  
  15. }  

不调用时运行不会报错,一旦给模板赋予对象:CTemplate<int> test ;

就会提示:无法解析的外部符号.....

原因:因为类模板和函数模板都不是真正的定义,真正的定义是在模板实体化的时候由编译器完成的。如果将模板的定义部分和实现部分分离开来,编译器真正要去完成模板实体化的时候就会因为找不到相应的代码而发生链接错误,所以这是编译器的问题,因为C++标准是要求能实现分离编译的。

所以,类模板还是老老实实在一个.h中声明并定义吧.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值