将模板的声明与定义写在一起实在很不优雅。尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,

然后在main函数里包含.h头文件,这样会报链接错误。why!!!!!!!!!!!!!

这是因为函数模板要被实例化后才能成为真正的函数,在使用函数模板的源文件中包含函数模板的头文件,(carefully!!!)

如果该头文件中只有声明,没有定义,那编译器无法实例化该模板,最终导致链接错误。(类模板同样!!)

 //---------------test.h-------------------//
void f();//这里声明一个函数f
//---------------test.cpp--------------//
#include”test.h”
void f()
{
…//do something
} //这里实现出test.h中声明的f函数
//---------------main.cpp--------------//
#include”test.h”
int main()
{
f(); //调用f
}

编译时会生成两个obj文件,main.obj和test.obj,而在main.obj里并没有f函数的二进制代码,这些代码实际存在于test.obj中。

在main.obj中对 f 的调用只会生成一行call指令,call指令的地址由链接器生成。

 //-------------test.h----------------//
template<class T>
class A
{
public:
void f(); //这里只是个声明
};
//---------------test.cpp-------------//
#include”test.h”
template<class T>
void A<T>::f()
{
…//do something
}
//---------------main.cpp---------------//
#include”test.h”
int main()
{
A<int> a;
a. f();
}

我们知道模板有个具现化的过程,在未被使用的时候是不会生成二进制文件的。所以当链接器去找f函数的地址时,因为在这之前没有调用过f(),test.obj里自然就没有f函数的二进制代码,于是就会报错。

要使模板声明与定义分开也不是没有办法。

第一种办法是在main函数里包含cpp文件

 //-------------test.h----------------//
template<class T>
class A
{
public:
void f(); //这里只是个声明
};
//---------------test.cpp-------------//
#include”test.h”
template<class T>
void A<T>::f()
{
…//do something
}
//---------------main.cpp---------------//
#include”test.cpp” //careful!!!!!!!!!
int main()
{
A<int> a;
a. f();
}

这样三个文件的内容通过include实际上包含在同一个文件里,自然就不会出错了

 //-------------test.h----------------//
template<class T>
class A
{
public:
void f(); //这里只是个声明
};
#include<test_impl.h>
//---------------test_impl.h-------------//
template<class T>
void A<T>::f()
{
…//do something
}
//---------------main.cpp---------------//
#include”test.h”
int main()
{
A<int> a;
a. f();
}

这两种方法实际上都是包含编译,没有本质的区别,不过感觉第二种方法看起来比较舒服

 //-------------test.h----------------//
template<class T>
class A
{
public:
void f(); //这里只是个声明
};
//---------------test.cpp-------------//
#include”test.h”
template<class T>
void A<T>::f()
{
…//do something
}
template class A<int>;//!!!!!!在这里实现了具现了类型 这样编译就不会有问题了 但是这样不太好 自己想为什么 !!!
//---------------main.cpp---------------//
#include”test.h”
int main()
{
A<int> a;
a. f();
}

差不多了吧 就这样OK了  其实是看的别人的博客!

最新文章

  1. Spring之旅
  2. 你想不到的!CSS 实现的各种球体效果【附在线演示】
  3. Xcode 7.2.1 下载地址
  4. Xcode编译相关
  5. AngularJS开发指南14:AngularJS的服务详解
  6. HBase分布式安装
  7. Hive技术文档
  8. 获取android源码时repo的错误
  9. 机器学习:scipy和sklearn中普通最小二乘法与多项式回归的使用对
  10. unity+xlua开发中的问题笔记
  11. Django的路由层
  12. 异象石(就是sdio宝藏那题)
  13. perl debug
  14. phpstudy一系列安装问题
  15. 初探FFT(快速傅里叶变换)
  16. MySQL查看表结构三种方法
  17. C#:(问题)已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
  18. git查看某一个文件的修改历史
  19. Ext JS 6学习文档-第8章-主题和响应式设计
  20. Unity3D 手游开发中所有特殊的文件夹

热门文章

  1. python3-列表中存储字典
  2. SDUT 1488 数据结构实验:连通分量个数
  3. SpringMVC执行流程(四)
  4. DropDownList 控件的SelectedIndexChanged事件触发不了
  5. 使用jenkins来跑docker image的惨痛经历
  6. Go:创建新进程(os.StartProcess源码解读)
  7. Kafka学习文档
  8. ASP SQLDATASOURCE
  9. Angular2入门-架构总览
  10. Google Maglev 牛逼的网络负载均衡器(转)