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 ...
随机推荐
- try_catch_return
1.情况一(try中有return,finally中没有return): public class TryTest{ public static void main(String[] args){ S ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
- Python - 面向对象(三)公共变量,受保护变量,私有变量
前言 在Python的类里面,所有属性和方法默认都是公共的:但Python也可以设置受保护.私有类型的变量or方法 受保护类型的变量.方法 一般称为:protected变量 #!/usr/bin/en ...
- shell脚本基础-语法
一 变量 [root@T_FOOT-Home2-ZZZ01 ~]# a=hello [root@T_FOOT-Home2-ZZZ01 ~]# echo $a hello [root@T_FOOT-Ho ...
- 第十五周java实验作业
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1) 掌握Java应用程序的打包操作: Java程序的打包,程序编译完成后,程序员将.class文件压缩打 ...
- 题解 P2070 【刷墙】
前言 \(ZHK\)私人博客体验更佳 这道题目,\(n<=10^5\),显然在暗示我们使用\(n \log n\)的做法,我就是用了一个简单的贪心,通过了此题. 正文 在这道题中,我们发现,可以 ...
- TensorFlow RNN 教程和代码
分析: 看 TensorFlow 也有一段时间了,准备按照 GitHub 上的教程,敲出来,顺便整理一下思路. RNN部分 定义参数,包括数据相关,训练相关. 定义模型,损失函数,优化函数. 训练,准 ...
- OpenCV-Python 轮廓属性 | 二十三
目标 在这里,我们将学习提取一些常用的物体属性,如坚实度,等效直径,掩模图像,平均强度等.更多的功能可以在Matlab regionprops文档中找到. (注:质心.面积.周长等也属于这一类,但我们 ...
- spring源码阅读笔记06:bean加载之准备创建bean
上文中我们学习了bean加载的整个过程,我们知道从spring容器中获取单例bean时会先从缓存尝试获取,如果缓存中不存在已经加载的单例bean就需要从头开始bean的创建,而bean的创建过程是非常 ...
- Spring Boot创建一个HelloWorld项目
目录 Spring Boot 简介 微服务框架 以前使用spring开发web的方式 Spring Boot 启动器介绍 如何创建一个helloword的SpringBoot项目 Spring Boo ...