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 ...
随机推荐
- mysql那些事之索引篇
mysql那些事之索引篇 上一篇博客已经简单从广的方面介绍了一下mysql整体架构以及物理结构的内容. 本篇博客的内容是mysql的索引,索引无论是在面试还是我们日常工作中都是非常的重要一环. 索引是 ...
- Android位置服务开发
1. 使用LocationManager获取地理位置信息 代码如下: private TextView positiontext; private String provider; private L ...
- javascript中indexOf()和lastIndexOf()详解
ECMAScript5为数组实例添加两方法:indexOf()和lastIndexOf().这两个方法接受两个参数:要查找的项和(可选的)表示查找起点位置的索引.其中,indexOf()方法从数组的开 ...
- C# 获取系统所有字体
获取已安装的所有字体列表 System.Drawing.FontFamily StringBuilder str = ); InstalledFontCollection fonts = new In ...
- IPv4地址表示法详解
在TCP/IP协议中,IP地址是一个最基本的概念,本文就来参考<计算机网络>谢希仁 这本书,总结一下IPv4地址表示法的发展阶段,做个读书笔记. IP地址的编址方法共经过了三个历史阶段: ...
- Natas2 Writeup(水平越权)
Natas2: 查看源码,发现页面隐藏了一个图片的连接,分析图片,无隐写内容,联想到目录权限问题,访问同级目录http://natas2.natas.labs.overthewire.org/file ...
- Fast and accurate bacterial species identification in urine specimens using LC-MS/MS mass spectrometry and machine learning (解读人:闫克强)
文献名:Fast and accurate bacterial species identification in urine specimens using LC-MS/MS mass spectr ...
- JSP(一)----入门学习
## JSP 1.概念: * Java Server Pages:java服务端页面 * 可以理解为:一个特殊的页面,其中既可以直接定义html标签,又可以定义java代码 2.原理 * ...
- 强化学习之三:双臂赌博机(Two-armed Bandit)
本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译,该翻译是基于个人分享知识的目的进行的,欢迎交流!(This article is my personal t ...
- Redis总结--【持续更新】
# 什么是Redis? Redis 是完全开源免费的,是一个高性能的key-value内存数据库,读的速度是110000次/s,写的速度是81000次/s 它有以下三个特点: Redis不 ...