c++类模板之分文件编写问题及解决
我们在实际项目中一般习惯头文件(.h)和源文件(.cpp)分开写,这样做的好处良多,但是如果遇到了类模板,这样可能会有一点儿问题。
我们通过一个例子来看:
person.h:
#pragma once
#include<string>
#include<iostream>
using namespace std; template<class nameType,class ageType>
class Person {
public:
Person(nameType name, ageType age);
void show();
nameType m_Name;
ageType m_Age;
};
person.cpp:
#include"person.h" template<class nameType,class ageType>
Person<nameType, ageType>::Person(nameType name,ageType age)
{
this->m_Name = name;
this->m_Age = age;
} template<class nameType,class ageType>
void Person<nameType, ageType>::show()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
main.cpp:
#include<iostream>
using namespace std;
#include "person.h"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
编译发现如下错误:

错误原因分析:
由于类模板的成员函数是运行时才会创建,所以分文件编写时编译器找不到成员函数的实现
问题解决:
方法一(不推荐)
直接在main.cpp里将person.cpp包含进来,如下所示:
#include<iostream>
using namespace std;
#include "person.cpp"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
方法二(推荐)
将person.h、person.cpp的内容全部放入同一个文件person.hpp中,然后在main.cpp中将person.hpp包含进来即可
person.hpp:
#pragma once
#include<string>
#include<iostream>
using namespace std; template<class nameType,class ageType>
class Person {
public:
Person(nameType name, ageType age);
void show();
nameType m_Name;
ageType m_Age;
}; template<class nameType, class ageType>
Person<nameType, ageType>::Person(nameType name, ageType age)
{
this->m_Name = name;
this->m_Age = age;
} template<class nameType, class ageType>
void Person<nameType, ageType>::show()
{
cout << "姓名:" << this->m_Name << " 年龄:" << this->m_Age << endl;
}
main.cpp:
#include<iostream>
using namespace std;
#include "person.hpp"
void test()
{
Person<string, int> p("张三", );
p.show();
}
int main()
{
test();
system("pause");
return EXIT_SUCCESS;
}
运行结果:

总结:模板类不要分文件编写,写到一个类中即可
c++类模板之分文件编写问题及解决的更多相关文章
- c++类模板分文件编写存在的问题
c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...
- 【C/C++】函数的分文件编写
创建同名的头文件(.h)和cpp文件. 在头文件里写函数声明,在cpp文件中写函数定义. 在cpp文件中写#include "xx.h" //自定义头文件名 框架(include ...
- C++函数模板&类模板
函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式: template<class T> 或者 template<typename T> //末尾不加分 ...
- C++进阶-1-模板基础(函数模板、类模板)
C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...
- iOS开发——model类模板(过滤null和ID)
说明:model类模板已默认过滤null值,附加特殊情况的关键字ID名的冲突(需手动去掉注释代码).MyMessageModel为示例的名字.可以自己随便起. 1.自己创建一个继承与N ...
- C++中的单例类模板
1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ...
- C++Array类模板编写笔记
C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...
- VS2013,VS2015设置类模板文件表头
一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...
- linux库文件编写入门(笔记)
linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...
随机推荐
- GO系列 | 5分钟入门GO【译】
什么是Google Go? Google Go是由Robert Griesmer,Rob Pike和Ken Thompson在Google设计的一种开源编程语言. Go在语法上类似于C语言: 除了内存 ...
- 在k3d上快速安装Istio,助你在本地灵活使用K8S!
作者丨Mitsuyuki Shiiba 原文链接: https://dev.to/bufferings/tried-k8s-istio-in-my-local-machine-with-k3d-52g ...
- Go 武林外传 - 初出茅庐
没有旁白. 我叫小白, 白痴的白. 老头说我太笨了, 提前放我下山, 让我自生自灭. 对了, 忘了说了, 那老头是我师傅. 虽然我的内心深处是拒绝的, 但是我又打不过老头, 只好收拾铺盖滚犊子了. 算 ...
- [BUG]excel复制到input含有不可见内容(零宽字符)
现象 excel手机号复制到input框子, length长度和可见长度不一致. "176xxxx1115" 长度是 13 而不是 11. 原因 手机号前后被 excel 插入 ...
- Python习题集(二)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 a = [1, 2 ...
- CSS3-3D技术
CSS3-3D技术 transform翻译成汉语具有"变换"或者"改变"的意思. 此属性具有非常强大的功能,比如可以实现元素的位移.拉伸或者旋转等效果, 最能体 ...
- Java-字符流练习。(新手)
参考手册: 关键字: write() 写入存取 close() 结束 flush() 刷新缓冲区(缓冲区就是临时存放数据的区域.) currentTimeMillis() 返回以毫秒为 ...
- File 关键词
getParent() 获取父路径 getAbsoluteFile 获取绝对路径 length() 获得文件的字节数 getName() 获取路径中最后部分的名字 getPath() 获取整体路径. ...
- ASP.NET MVC5实现芒果分销后台管理系统(二):Code First快速集成EntityFramework
在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了AutoMapper,日志组件等,接下来我们将使用Entity Framework完善系统的持久化存储部分.这篇EF的构造,我将 ...
- Idea中使用http请求解决中文乱码问题
以请求百度为例,使用如下代码即可解决: GET https://www.baidu.com User-Agent: Mozilla/.X MetaSr 1.0