今天编码的时候,发现了一个错误,就是模板代码在链接的时候找不到方法。

情况大概如下:

在 "Manager.h" 中

class Manager {

public:

  template<typename T>

  void SetData(const T& value);

};

然后在cpp文件中定义SetData

template<typename T>

void Manager::SetData(const T& value) {

}

在另外一个main.cpp文件中使用

#include "Manager.h"

Manager mgr;

double n = 0;

mgr.SetData(n);

这样就会产生一个error LNK2019:无法解析的外部符号 “public: void __thiscall Manager::SetData<double>(const double&)” xxxx,该符号在 xx函数中被引用的链接错误。查了一下书籍,错误的原因在于,function template SetData(const T&)的定义没有具现化,Manager.h和Manager.cpp是分开编译的,在编译main.cpp的过程中,编译器假设这个template的定义在某个地方,因而只生成一个对该定义的reference,并将这个reference所指的定义式留给链接器去决议,但是在链接期间,又找不到这样一个定义。

Note:奇怪的是,如果n是int类型,又可以编译成功,但是回家后,我用自己的电脑试了一下,VS2008,int类型的也不行

解决这个问题有几个方法:

1)采用置入式。也就是定义也放在头文件中

2)显示具现化一份声明。

即在cpp文件中声明如下 template void Manager::SetData(const double&); ,这样做就要为每一个类型做一份声明,比较繁琐

3)采用export关键字。它会export出除inline之外的其他方法

export template <typename T>

class Manager {

public:

  void SetData(const T&); //这个声明就会被export

  void Print() {}; //不会被export

};

最新文章

  1. MySQL 存储过程游标
  2. jQuery插件编写规范
  3. Zookeeper-Zookeeper可以干什么
  4. UltraEdit 编译输出中文乱码的解决办法
  5. Swift3.0语言教程字符串转换为数字值
  6. cocos2dx实现经典飞机大战
  7. Fiddler-008-简单模拟性能测试
  8. Myeclipse中tomcat所应用的JDK设置
  9. JS当前日期相加相减
  10. (转) Overloads and templates
  11. 发送邮件java实现
  12. 我使用过的Linux命令
  13. 慕尼黑大学公开课 Competitive Strategy(竞争策略)总结
  14. tcp并发服务端
  15. Java基础(3) -字符串
  16. 九天学会Java,第五天,函数定义函数调用
  17. ES6的Symbol
  18. springCloud之配置中心学习
  19. ie 浏览器缓存问题
  20. 解决highCharts导出功能汉化问题

热门文章

  1. 【BZOJ3270】博物馆 期望DP+高斯消元
  2. ASP.NET MVC + ADO.NET EF 项目实战(一):应用程序布局设计
  3. gIt 常用 操作
  4. 【译】常见 Java 异常解释(恶搞版)
  5. c++操作flash
  6. Django使用富文本编辑器
  7. 【Prometheus】第二篇---基本查询语法
  8. 混沌相关blog+节选
  9. maven导入项目时,缺少部分source folder
  10. mysql sql语句:行转列问题