写模板类的时候出的问题,调了一晚上,就是链接出错,于是搜索引擎开始工作,搜到篇简单的博文解释,暂时做个标记吧
原文地址:http://blog.youkuaiyun.com/hgy413/article/details/6441602
我们习惯是.h中放类的函数声明,在.cpp中放类的函数定义,但在类模板中不能这样做,如随手写了个demo测试了下
.h中代码
- #pragma once
- template <class T>
- class CTemplate
- {
- public:
- CTemplate(void);
- ~CTemplate(void);
- void Fun(T a) ;
- };
.cpp中代码
- #include "StdAfx.h"
- #include "Template.h"
- template<class T>
- CTemplate<T>::CTemplate(void)
- {
- }
- template<class T>
- CTemplate<T>::~CTemplate(void)
- {
- }
- template<class T>
- void CTemplate<T>::Fun(T a)
- {
- int b = a;
- }
不调用时运行不会报错,一旦给模板赋予对象:CTemplate<int> test ;
就会提示:无法解析的外部符号.....
原因:因为类模板和函数模板都不是真正的定义,真正的定义是在模板实体化的时候由编译器完成的。如果将模板的定义部分和实现部分分离开来,编译器真正要去完成模板实体化的时候就会因为找不到相应的代码而发生链接错误,所以这是编译器的问题,因为C++标准是要求能实现分离编译的。
所以,类模板还是老老实实在一个.h中声明并定义吧.