我们在实际项目中一般习惯头文件(.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++类模板之分文件编写问题及解决的更多相关文章

  1. c++类模板分文件编写存在的问题

    c++分文件编写的编译机制: 各个文件独立编译,如果在某.cpp文件中出现了函数调用,但是在此.cpp文件并没有对应函数的实现.此时就会在函数调用出生成特定的符号,在之后的链接过程完成函数调用. C+ ...

  2. 【C/C++】函数的分文件编写

    创建同名的头文件(.h)和cpp文件. 在头文件里写函数声明,在cpp文件中写函数定义. 在cpp文件中写#include "xx.h" //自定义头文件名 框架(include ...

  3. C++函数模板&类模板

    函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式:  template<class T> 或者 template<typename T> //末尾不加分 ...

  4. C++进阶-1-模板基础(函数模板、类模板)

    C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...

  5. iOS开发——model类模板(过滤null和ID)

            说明:model类模板已默认过滤null值,附加特殊情况的关键字ID名的冲突(需手动去掉注释代码).MyMessageModel为示例的名字.可以自己随便起. 1.自己创建一个继承与N ...

  6. C++中的单例类模板

    1,本节课讲述单例类模式,实现并抽取相关代码实现单例类模板,在以后开发工作 中,如果想要使用单例模式,那么直接使用今天开发的单例类模板就可以: 2,需求的提出: 1,在架构设计时,某些类在整个系统生命 ...

  7. C++Array类模板编写笔记

    C++Array类模板 函数模板和类模板都属于泛型技术,利用函数模板和类模板来创建一个具有通用功能的函数和类,以支持多种不同的形参,从而进一步简化重载函数的函数体设计. 声明方法:template&l ...

  8. VS2013,VS2015设置类模板文件表头

    一般VS的类模板文件是放在C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSha ...

  9. linux库文件编写入门(笔记)

    linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...

随机推荐

  1. IDEA 激活码,IDEA 注册码,IDEA 2019.3 激活码

    文末分享:IDEA 激活码, IDEA 注册码,已购买的正版授权,请不要网上传播. 声明:支持知识产权,支持正版产权,以下仅限个人学习使用IDEA工具时随笔记录,禁止商业使用. 一.下载idea 下载 ...

  2. 【译】HTTP/2 为更快速的网站而生

    最近在做一个内部的服务对接,使用了Google的gRPC框架,gRPC是基于HTTP/2和protocol buffers实现的,所以额外去了解了一下HTTP/2,找到这这边文章.这篇文章虽然是写于2 ...

  3. CentOS7安装和配置ftp服务

    目录 一.ftp简介 二.安装ftp软件包 1.安装ftp服务器 2.安装ftp客户端 三.配置ftp服务器 1.关闭SELINUX 2.配置ftp数据端口参数 3.开通防火墙 4.启动vsftpd服 ...

  4. 网维大师无盘刷新B盘方法

  5. 计网-ping服务命令与ICMP协议

    目录 一.IP协议的助手 —— ICMP 协议(网络层协议) 二.ping —— 查询报文类型的使用 三.traceroute —— 差错报文类型的使用 参考:从Wireshark抓包软件角度理解PI ...

  6. 高效code review指南

    大多数程序员都知道并且相信code review(代码审查)的重要性,但并一定都能很好的执行这一过程,做好code review也需要遵循一定的原则.流程和规范. 我们团队的code review实践 ...

  7. SpannableStringBuilder实现TextView华丽变身

    前言 想要在TextView 的文本添加一些突出文字,然后点击可以进行跳转,首先想到的就是TextView拼接,但是考虑到换行后的显示又不是很合适,一番查询后发现了SpannableStringBui ...

  8. c++ 的vector sort遇到栈错误

    在做pat乙级1082 射击比赛时 遇到了sort 段错误. 题目链接:https://www.patest.cn/contests/pat-b-practise/1082 感觉写的没啥毛病 但就是段 ...

  9. 2,MapReduce原理及源码解读

    MapReduce原理及源码解读 目录 MapReduce原理及源码解读 一.分片 灵魂拷问:为什么要分片? 1.1 对谁分片 1.2 长度是否为0 1.3 是否可以分片 1.4 分片的大小 1.5 ...

  10. 使用条件随机场模型解决文本分类问题(附Python代码)

    对深度学习感兴趣,热爱Tensorflow的小伙伴,欢迎关注我们的网站!http://www.tensorflownews.com.我们的公众号:磐创AI. 一. 介绍 世界上每天都在生成数量惊人的文 ...