类模板分文件编写

问题: 类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到

解决:

解决方式1:直接包含.cpp源文件

解决方式2:将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定的名称,并不是强制

普通写法:

cpp 复制代码
#include<iostream>
using namespace std;

//类模板分文件编写的问题以及解决
#include<string>
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;
}

void test()
{
	Person <string, int>p("Jerry", 20);
	p.showPerson();
}


int main()
{
	test();

	return 0;
}

问题:分文件编写中,在类模板分文件编写.cpp中包含person.h头文件仍然出错!

解决方式1:直接包含.cpp源文件

创建person.h添加以下代码:

cpp 复制代码
#pragma once
#include<iostream>
using namespace std;

#include<string>
template<class T1, class T2>
class Person
{
public:
	Person(T1 name, T2 age);
	void showPerson();

	T1 m_Name;
	T2 m_Age;
};

创建person.cpp添加以下代码:

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;
}

类模板分文件编写.cpp中:

cpp 复制代码
#include<iostream>
using namespace std;

//第一种解决方式,直接包含源文件
#include "person.cpp"//将这行的#include "person.h"改为#include "person.cpp"

void test()
{
	Person <string, int>p("Jerry", 20);
	p.showPerson();
}

int main()
{
	test();

	return 0;
}

解决方式2:将.h和.cpp中的内容写到一起,将后缀名改为.hpp文件(常用)

创建person.hpp添加以下代码:

cpp 复制代码
#pragma once
#include<iostream>
using namespace std;

#include<string>
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;
}

类模板分文件编写.cpp中:

cpp 复制代码
#include<iostream>
using namespace std;

//包含hpp头文件
#include "person.hpp"

void test()
{
	Person <string, int>p("Jerry", 20);
	p.showPerson();
}

int main()
{
	test();

	return 0;
}

总结:主流的解决方式是第二种,将类模板成员函数写到一起,并将后缀名改为.hpp

相关推荐
CoovallyAIHub8 分钟前
单目深度估计重大突破:无需标签,精度超越 SOTA!西湖大学团队提出多教师蒸馏新方案
深度学习·算法·计算机视觉
CoovallyAIHub11 分钟前
从FCOS3D到PGD:看深度估计如何快速搭建你的3D检测项目
深度学习·算法·计算机视觉
偷偷的卷38 分钟前
【算法笔记 day three】滑动窗口(其他类型)
数据结构·笔记·python·学习·算法·leetcode
北京地铁1号线1 小时前
Zero-Shot(零样本学习),One-Shot(单样本学习),Few-Shot(少样本学习)概述
人工智能·算法·大模型
大白的编程日记.1 小时前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
网小鱼的学习笔记1 小时前
python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
开发语言·python·mongodb
C语言小火车1 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
Q_Q5110082851 小时前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
亮1111 小时前
Maven 编译过程中发生了 Java Heap Space 内存溢出(OutOfMemoryError)
java·开发语言·maven
凤年徐1 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法