目录
- 一、程序及输出
- 1.1 .h文件+cpp
- 1.2 包含hpp
- 二、分析与总结
一、程序及输出
1.1 .h文件+cpp
person.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
person.cpp
#include "person.h"
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template<class T1, class T2>
void Person<T1, T2>::showPerson()
{
cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;
}
main.cpp
#include<iostream>
using namespace std;
#include "person.h"
#include <string>
void test01()
{
Person<string, int> P("Jerry", 20);
P.showPerson();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
报错:
之前文章说过:类模板中的成员函数 并不是一开始创建的,而是在运行阶段确定出T的数据类型才去创建
所以会链接不到
main.cpp
内容修改:
#include “person.h”—>#include “person.cpp”
运行正常,但是包含文件格式略显不规范
1.2 包含hpp
类模板的声明和定义要写在一个.hpp文件中,声明和定义不可以分开,因为分文件的话,main.cpp中只引入.h,在类模板进行二次编译的时候,无法找到类的定义,会出错。所以要将其声明和定义放到一个头文件中。类模板必须要写在.hpp文件中。
将h文件和cpp文件综合到一个person.hpp
文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age);
void showPerson();
T1 m_Name;
T2 m_Age;
};
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
template<class T1, class T2>
void Person<T1, T2>::showPerson()
{
cout << "姓名: " << this->m_Name << " 年龄:" << this->m_Age << endl;
}
main.cpp
#include<iostream>
using namespace std;
#include "person.hpp"
#include <string>
void test01()
{
Person<string, int> P("Jerry", 20);
P.showPerson();
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出:
二、分析与总结
类模板中的成员函数,不会一开始创建,因此导致分文件编写时连接不到函数的实现,出现无法解析的外部命令错误
解决方式1:
直接包含.cpp文件 (不推荐)
解决方式2:
将类声明和实现写到同一个文件中,将文件的后缀名改为 .hpp 即可
参考链接:
c++中.hpp文件的使用