C++类模板分文件编写

这篇具有很好参考价值的文章主要介绍了C++类模板分文件编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.使用常规分文件创建方法实现类模板

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

include文件下的person.h

#pragma once // 防止头文件重复包含
#include<iostream>
#include<string>
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;
}

mian.cpp

#include<iostream>
#include "person.h"
using namespace std;

void test01()
{
    Person<string,int> P("Jie",18);
    P.showPerson();
}


int main()
{
    test01();
    return 0;
}

编译报错。

因为类模板成员函数一开始是不会创建的,
当你去包含.h的时候,相当于只是让编译器看到了person.h(声明代码)。编译器没有看到person.cpp中的实现构造函数和 void showPerson()的代码。所以链接阶段失败。

二.解决方法

1:直接包含.cpp源文件 
2.将声明和实现写到同一个文件中,并更改后缀名为.hpp,.hpp是约定的名称。

2.1 直接包含.cpp源文件

把 .h改为.cpp时,相当于让编译器看到实现的代码。

#include<iostream>
#include "person.cpp"
using namespace std;

void test01()
{
    Person<string,int> P("Jie",18);
    P.showPerson();
}


int main()
{
    test01();
    return 0;
}

此时编译器可以成功编译了。
但是一般不用这种方法,因为一般是不会直接导入cpp源码的。

2.2 将.h和.cpp中的声明和实现内容写到一起,将后缀名改为.hpp文件

include/person.hpp

#pragma once // 防止头文件重复包含
#include<iostream>
#include<string>
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;
}

mian.cpp

#include<iostream>
#include "person.hpp"
using namespace std;

void test01()
{
    Person<string,int> P("Jie",18);
    P.showPerson();
}


int main()
{
    test01();
    return 0;
}

编译:

g++  main.cpp -Iinclude

运行:文章来源地址https://www.toymoban.com/news/detail-793368.html

./a.out

到了这里,关于C++类模板分文件编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++初学笔记“模板”:矩阵运算

    (后期补充!这张图可以帮助理解复制构造函数和构造函数之间的关系。)  C++初学“模板”:矩阵运算   一道作业题,题目: (1)定义类模板T_Counter,实现基本类型数据的 + 、 - 、 * 、 = 、 、 运算; (2)类模板T_Matrix,实现矩阵运算。 (题目要求很模糊,我为了少出点

    2023年04月25日
    浏览(35)
  • C++模板初阶(个人笔记)

    泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。 函数模板,它本身并 不是函数 ,是编译器用使用方式产

    2024年04月11日
    浏览(37)
  • 【高级程序设计语言C++】初识模板

    概念: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 具体格式: templatetypename T1, typename T2,…,typename Tn 返回值类型 函数名(参数列表){} 输出结果: typename是用来定义模板参数,也可以使用class(切记

    2024年02月15日
    浏览(42)
  • 【go语言开发】编写单元测试

    本文主要介绍使用go语言编写单元测试用例,首先介绍如何编写单元测试,然后介绍基本命令的使用,最后给出demo示例 在go语言中编写单元测试时,使用说明 测试文件命名 :在 Go 语言中,测试文件的命名应与被测试的源代码文件相同,但以 “_test” 结尾。例如,如果你的源

    2024年02月04日
    浏览(42)
  • [C++开发 03 _ 模板(167)]

    1.1模板的概念  模板的特点: 模板不可以直接使用,它只是一个框架 模板的通用并不是万能的 1.2函数模板 1.2.1函数模板语法 函数模板的引入: 函数模板的举例:  总结: 函数模板利用template 使用函数模板有两种方式:1、自动类型推导     2、显示指定类型 模板的

    2024年01月20日
    浏览(37)
  • C++学习笔记-第11单元 标准模板库介绍

    注:本部分内容主要来自中国大学MOOC北京邮电大学崔毅东的 《C++程序设计》课程。 注:94条 C++程序规范。   本单元重点是对标准模板库中的 顺序容器 、 关联容器 的使用,以及 如何创建迭代器以遍历容器 。在使用容器时要注意不同容器的实现方式对遍历、搜索、删除、

    2024年02月13日
    浏览(39)
  • c++学习笔记-提高编程-模板(哔站-黑马程序员c++教学视频)

    通用的模具,提高代码复用性 不可以直接使用,只是一个框架;模板的通用性并不是万能的。 3.2.1 函数模板 函数模板的作用:建立一个通用函数,其函数返回值类型和参数类型可以不具体确定,用一个虚拟的类型来代表。 1)语法: templatetypename T//函数声明或定义 函数 temp

    2023年04月11日
    浏览(81)
  • K8S学习笔记-01(yaml文件编写)

    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。 邮箱:yinwanit@163.com 记录k8s中yaml文件编写相关内容。 k8s官网文档库:https://kubernetes.io/docs/home/ kubelet 命令参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands k8s中yaml文件结尾需以.yml或.yaml结

    2024年02月14日
    浏览(37)
  • Django笔记二十之手动编写migration文件

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十之手动编写migration文件 前面介绍过,migration 文件主要记录的是 Django 系统 model 的变化,然后通过 migrate 命令将变化适配到数据库中。 比如在某个 application 下新增了某张表,或者对某张表更改了字段,可以生成 migration

    2023年04月09日
    浏览(44)
  • effective c++ 43-处理模板化基类的名称 笔记

    该节主要分析了一个写模板时常常会遇到的一个编译错误。 这里有一个模板基类,有派生类继承了模板基类,并调用了基类中的方法,但是编译器却会报找不该方法,这是怎么回事? 编译输出如下: 从编译的输出也可以看出,原因是编译器觉得 sendClear 含义不明确,编译器

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包