模板类h和cpp分开写问题浅析
.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分开写问题浅析相关推荐
- Sophus库(Linux下)的安装(模板类.hpp,非模板类.h)
都不在home目录下,如果你在home下请把sudo去掉 模板类安装 这通常不会有什么问题,如果有一般是缺依赖->传送门 sudo git clone https://github.com/st ...
- c++模板类声明和定义的问题
这里在学习的过程中遇到的一些问题,比较简单,但还是记下来,以免下次遇到这个问题再犯,大佬们可跳过哦.先简单的介绍下模板的概念 C++模板(泛型编程) c++模板是泛型编程的基础,所谓泛型编程也是一种思 ...
- 在类模板的声明和定义中把.h与.cpp分离
看了几位大吓的回复,深深地感觉到了这篇附笔中可能存在错误,于是把最初遇到此问题时的环境再模拟了一下,现在可以确认这篇附笔中的确存在问题,现在就修正一下,并对各位表示歉意. 6月初的一个项目中需要写一个 ...
- c++模板类(链表),实现正向反向找到链表中最大值,并比较时间差异
问题描述 实现链表容器模板类,利用模板实现找到公司中工资最高的员工的工资,实现正向反向查找,并且比较两种方法的时间差异. 代码实现 公司类Company.h #ifndef COMPCONT_H #d ...
- 【c++】因模板类导致的 LNK2019 错误:“ 无法解析的外部符号 ” 详解
最近在做项目的时候用到了模板类 果不其然出现了那个错误 LNK2019:无法解析的外部符号 网上百度到的结果繁花怒放,大多数不符合我的需求,故自己研究了下C++的模板类规则,试图找出问题所在 ---- ...
- 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)
**01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...
- 如何写模板类?(模板类的简单例子)
本文通过c++ primer plus中的例子来学习写模板类. 1.为什么需要模板类? 为了满足代码重用的需求. 比如stack类,希望不同的类型都能用. 先看看用typedef 定义的stack类. ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:余天升 链接:http://www.zhihu.com/question/20630104/answer/15722407 ...
- 关于模板函数/模板类编译成DLL
]关于模板函数/模板类编译成DLL Posted on 2011-08-16 08:48 单鱼游弋 阅读( 353) 评论( 0) 编辑 收藏 要编译成DLL,就要声明和实现分开. 首先文件组织是这样 ...
最新文章
- UVALive5379 UVA270 Lining Up
- 持续集成-软件和库的统一
- 『安全漏洞』Windows 云同步引擎API整数溢出漏洞
- Annotation 的前世今生
- 腾讯云数据库2020年度盛典等你来
- SQL Server where语句使用举例
- app 缓存html页面,HTML5本地存储VS App缓存离线网站浏览
- python中random is not defined_Python random库使用方法及异常处理方案
- ai带来的革命_AI革命就在这里。 这与我们预期的不同。
- 创建Oracle定时任务及其各项操作
- [BZOJ5145] [Ynoi2018] 五彩斑斓的世界 [并查集][分块][摊还分析]
- Prompt+对比学习,更好地学习句子表征
- 2020软件构造实验三
- 8 岁小学生B站教编程惊动苹果,库克亲自送生日祝福!
- 网络协议分析(3):FTP
- Oracle DBA手记4:数据安全警示录
- I/O error reading PNG header! java截取png图片时遇到的问题
- LVGL 8.2 meter控件实现模拟时钟
- 多样数字人民币钱包来袭,阻力与动力并存
- [突变测试] 一种新的测试方法论