.h文件

#pragma oncetemplate<class T>
class Person
{
public:Person(T age);void Show();
public:T age;
};

.cpp文件

#include "Person.h"template<class T>
Person<T>::Person(T age)
{this->age = age;
}template<class T>
void Person<T>::Show()
{cout << "Age:" << age << endl;
}

main.cpp

#include<iostream>#include "Person.h"using namespace std;int main()
{Person<int>p(10);p.Show();return 0;
}

此时编译出现错误:

错误 1 error LNK2019: 无法解析的外部符号 “public: __thiscall Person::Person(int)” (??0?$Person@H@@QAE@H@Z),该符号在函数 _main 中被引用 \代码\模板类h和cpp分开写\模板类h和cpp分开写.obj 模板类h和cpp分开写

错误 2 error LNK2019: 无法解析的外部符号 “public: void __thiscall Person::Show(void)” (?Show@?$Person@H@@QAEXXZ),该符号在函数 _main 中被引用 \代码\模板类h和cpp分开写\模板类h和cpp分开写.obj 模板类h和cpp分开写

错误 3 error LNK1120: 2 个无法解析的外部命令\代码\test01\Debug\模板类h和cpp分开写.exe 1 1 模板类h和cpp分开写

而注释掉Personp(10);p.Show();后编译成功
问题分析:
这和c++编译机制和模板实现机制有关。
c++是独立编译,例如a.cpp、b.cpp、c.cpp三个文件,先独立编译成三个独立的目标文件,即a.o、b.o、c.o,然后再通过链接器链接起来,生成可执行文件。
在编译时,a.cpp发现一个函数调用,在当前文件找不到函数定义,则在函数位置生成符号,在链接时,再寻找这个函数。
模板是两次编译。第一次编译时只对模板进行编译,不生成具体函数,在调用时才生成具体函数。

所以在这个项目中,编译main.cpp时,会编译Person.h,而Person.h里只有函数声明,不进行编译。则在链接器寻找函数时,因为寻找不到函数出现错误。而Person.cpp编译时,函数模板只进行第一次编译,因为没有具体使用,所以没有进行第二次编译,没有生成具体函数。所以在main.cpp链接时,因为寻找不到函数出现错误。

改正:
在main.cpp中将#include “Person.h”替换为#include “Person.cpp”.

所以在写类模板时,声明和定义写在一个文件里。文件后缀为hpp!

模板类h和cpp分开写问题浅析相关推荐

  1. Sophus库(Linux下)的安装(模板类.hpp,非模板类.h)

    都不在home目录下,如果你在home下请把sudo去掉 模板类安装 这通常不会有什么问题,如果有一般是缺依赖->传送门 sudo git clone https://github.com/st ...

  2. c++模板类声明和定义的问题

    这里在学习的过程中遇到的一些问题,比较简单,但还是记下来,以免下次遇到这个问题再犯,大佬们可跳过哦.先简单的介绍下模板的概念 C++模板(泛型编程) c++模板是泛型编程的基础,所谓泛型编程也是一种思 ...

  3. 在类模板的声明和定义中把.h与.cpp分离

    看了几位大吓的回复,深深地感觉到了这篇附笔中可能存在错误,于是把最初遇到此问题时的环境再模拟了一下,现在可以确认这篇附笔中的确存在问题,现在就修正一下,并对各位表示歉意. 6月初的一个项目中需要写一个 ...

  4. c++模板类(链表),实现正向反向找到链表中最大值,并比较时间差异

    问题描述 实现链表容器模板类,利用模板实现找到公司中工资最高的员工的工资,实现正向反向查找,并且比较两种方法的时间差异. 代码实现 公司类Company.h #ifndef COMPCONT_H #d ...

  5. 【c++】因模板类导致的 LNK2019 错误:“ 无法解析的外部符号 ” 详解

    最近在做项目的时候用到了模板类 果不其然出现了那个错误 LNK2019:无法解析的外部符号 网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在 ---- ...

  6. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  7. 如何写模板类?(模板类的简单例子)

    本文通过c++ primer plus中的例子来学习写模板类. 1.为什么需要模板类? 为了满足代码重用的需求. 比如stack类,希望不同的类型都能用. 先看看用typedef 定义的stack类. ...

  8. C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:余天升 链接:http://www.zhihu.com/question/20630104/answer/15722407 ...

  9. 关于模板函数/模板类编译成DLL

    ]关于模板函数/模板类编译成DLL Posted on 2011-08-16 08:48 单鱼游弋 阅读( 353) 评论( 0) 编辑 收藏 要编译成DLL,就要声明和实现分开. 首先文件组织是这样 ...

最新文章

  1. UVALive5379 UVA270 Lining Up
  2. 持续集成-软件和库的统一
  3. 『安全漏洞』Windows 云同步引擎API整数溢出漏洞
  4. Annotation 的前世今生
  5. 腾讯云数据库2020年度盛典等你来
  6. SQL Server where语句使用举例
  7. app 缓存html页面,HTML5本地存储VS App缓存离线网站浏览
  8. python中random is not defined_Python random库使用方法及异常处理方案
  9. ai带来的革命_AI革命就在这里。 这与我们预期的不同。
  10. 创建Oracle定时任务及其各项操作
  11. [BZOJ5145] [Ynoi2018] 五彩斑斓的世界 [并查集][分块][摊还分析]
  12. Prompt+对比学习,更好地学习句子表征
  13. 2020软件构造实验三
  14. 8 岁小学生B站教编程惊动苹果,库克亲自送生日祝福!
  15. 网络协议分析(3):FTP
  16. Oracle DBA手记4:数据安全警示录
  17. I/O error reading PNG header! java截取png图片时遇到的问题
  18. LVGL 8.2 meter控件实现模拟时钟
  19. 多样数字人民币钱包来袭,阻力与动力并存
  20. [突变测试] 一种新的测试方法论

热门文章

  1. 数据结构C语言实现高铁客运订票系统
  2. 图解 Word2Vec
  3. Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、
  4. Python全栈开发-Python爬虫-03 正则表达式详解
  5. 北大青鸟java数组_北大青鸟:Java 数组解说(1)
  6. 北大青鸟java初级培训_java初级编程
  7. 关于中文模拟器的问题
  8. Android-Gradle(4)gradle插件V2签名多风味打包
  9. Java使用UCanAccess连接mdb数据库
  10. IE主页注册表项修改