【模板代码的组织结构与模板的显式实例化和声明】模板代码的组织结构与模板的显式实例化和声明

一、模板的组织结构

之前对于模板,我们都是写在同一个 . c p p .cpp .cpp文件下,那如果我们将模板分开,单独开一个 . h .h .h . c p p .cpp .cpp来创建模板,会发生什么?

首先,我们创建一个 m y c l a s s . h myclass.h myclass.h文件,写入以下代码:

#ifndef __MYCLASS_H__
#define __MYCLASS_H__
#include<iostream>
template<typename T>
class MYClass {
public :void func();
};
#endif 

注意这里的代码是防止多次引用头文件

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

然后我们创建一个 m y c l a s s . c p p myclass.cpp myclass.cpp文件,类外实现一下模板

template<typename T>
void MYClass<T>::func() {std::cout << "MYClass::func成员函数执行了\n";
}

然后再主函数 m a i n . c p p main.cpp main.cpp内写入:

#include "myclass.h"int main() {MYClass<int> myc;myc.func();return 0;
}

看上去没什么问题,编译器也没有报错,我们运行一下:
在这里插入图片描述
显然,这里链接失败了,原因如下:

编译器首先在 m a i n . c p p main.cpp main.cpp中尝试实例化出 M Y C l a s s < i n t > MYClass<int> MYClass<int>这个类,由于在当前编译单元找不到 M Y C l a s s MYClass MYClass类模板的实现,编译器不会因此报错,而是假设在别的编译单元已经实例化出了这个类。但是链接的时候发现别的编译单元也没有实例化出这个类,因此就会发生链接错误。

因此,解决方法就是在 m y c l a s s . h myclass.h myclass.h文件中就完成模板的实现,这样在引用头文件的时候就不会因为编译器的忽略而发生链接错误了:

template<typename T>
class MYClass {
public:void func() ;};//直接再.h文件内实现
template<typename T>
void MYClass<T>::func() {std::cout << "MYClass::func成员函数执行了\n";
}

编译运行:
在这里插入图片描述

二、模板的显式实例化、模板声明、代码组织结构

如果多个 . c p p .cpp .cpp文件调用同一个模板,可能会实例化出多个相同的实例模板,我们可以通过对模板的显式实例化和声明来避免多次实例化。

我们加入 c a . h ca.h ca.h,在里面定义一些模板

#ifndef __CAH__
#define __CAH__
#include<iostream>
template<typename C>
class A {
public://成员函数模板template<typename T2>A(T2 v1, T2 v2); template<typename T>void myft(T tmpt) {std::cout << tmpt << "\n";}C m_ic;
};//类外实现构造函数
template<typename T>
template<typename T2>
A<T>::A(T2 v1,T2 v2) {std::cout << v1 << " " << v2 << "\n";
}//定义一个函数模板
template<typename T>
void myfunc(T v1, T v2) {std::cout << v1 + v2 << "\n";
}#endif 

这里有构造函数模板和成员函数模板。
然后我们在 t e s t . c p p test.cpp test.cpp m a i n . c p p main.cpp main.cpp中调用这些模板:

t e s t . c p p test.cpp test.cpp

#include "ca.h"void myfunc() {A<float>a(1, 2);a.myft(3);myfunc(1, 2);
}

m a i n . c p p main.cpp main.cpp

#include "ca.h"int main() {A<float>a(1, 2);A<float>a2(1.1, 2.2);a.myft(3);myfunc(1, 2);return 0;
}

这样我们会实例化出多个 A < f l o a t > A<float> A<float> m y f u n c ( ) myfunc() myfunc()函数,那么我们可以通过模板声明和显式实例化来避免:
t e s t . c p p test.cpp test.cpp m a i n . c p p main.cpp main.cpp进行更改:
在这里插入图片描述
在这里插入图片描述
加入以上的内容,注意,实例化声明可以有多个,而实例化定义只能有一个,且必须在定义后才能声明。
这样我们实例化出的模板只会有一个,然后通过在链接的时候就会在别的 . c p p .cpp .cpp文件中找到这个定义。

注意的是,这样的显式实例化定义,如 t e m p l a t e A < f l o a t > template A<float> templateA<float>,会将类 A A A中所有的内容都实例化出来,这样也会带来额外的开销。

总之,对于实例化定义和声明有其优秀的一面,也有其不好的一面,要看实际情况来选择具体的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425899.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024.08】图模互补:知识图谱与大模型融合综述-笔记

阅读目的&#xff1a;假设已有一个知识图谱&#xff0c;如何利用图谱增强模型的问答&#xff0c;如何检索知识图谱、知识图谱与模型的文本如何相互交互、如何利用知识图谱增强模型回答的可解释性。 从综述中抽取感兴趣的论文进一步阅读。 来源&#xff1a;图模互补&#xff1…

阿里云 Quick BI使用介绍

Quick BI使用介绍 文章目录 阿里云 Quick BI使用介绍1. 创建自己的quick bi服务器2. 新建数据源3. 上传文件和 使用4. 开始分析 -选仪表盘5. 提供的图表6. 一个图表的设置使用小结 阿里云 Quick BI使用介绍 Quick BI是一款全场景数据消费式的BI平台&#xff0c;秉承全场景消费…

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的?

【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f; 文章目录 【梯度下降|链式法则】卷积神经网络中的参数是如何传输和更新的&#xff1f;1. 什么是梯度&#xff1f;2.梯度…

华为eNSP使用详解

eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是华为提供的一款网络仿真平台&#xff0c;它允许用户在没有真实设备的情况下进行网络实验和学习网络技术。eNSP可以模拟各种网络设备&#xff0c;如交换机、路由器、防火墙等&#xff0c;并支持创建多种网…

Linux 环境打包 QT 程序

目录 前言 一、安装Qt库和编译器 二、编译生成可执行文件 三、准备脚本 四、添加程序依赖库 五、添加 Qt 相关依赖库 六、发布 deb 安装包 参考文章 前言 Qt是一个跨平台的GUI框架&#xff0c;可以在多种操作系统上运行&#xff0c;包括Linux、Windows和macOS。因此&am…

ASP.NET Core高效管理字符串集合

我们在开发 Web 项目时经常遇到需要管理各种来源的字符串集合&#xff08;例如HTTP 标头、查询字符串、设置的值等&#xff09;的情况。合理的管理这些字符串集合不仅可以减少出bug的几率&#xff0c;也能提高应用程序的性能。ASP.NET Core 为我们提供了一种特殊的只读结构体 S…

C/C++实现植物大战僵尸(PVZ)(打地鼠版)

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 游戏…

【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转换

前言&#xff1a; 下面打印日志用的是FastJSON依赖库中的 Log4j2。依赖&#xff1a; <!-- Alibaba Fastjson --> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version> …

[Redis] Redis中的set和zset类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

OpenCV运动分析和目标跟踪(1)累积操作函数accumulate()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将一个图像添加到累积图像中。 该函数将 src 或其部分元素添加到 dst 中&#xff1a; dst ( x , y ) ← dst ( x , y ) src ( x , y ) if mask…

mysql笔记8(多表查询)

文章目录 1. union联合查询可能会用到去重操作 2. inner join 内连接3. left join 左连接4. right join 右连接5. cross join 交叉连接6. natural join 自然连接natural left join 自然左连接natural right join 自然右连接自然连接的两张表没有同名字段怎么办&#xff1f; 7. …

自定义EPICS在LabVIEW中的测试

继续上一篇&#xff1a;LabVIEW中EPICS客户端/服务端的测试 变量定义 You can use CaLabSoftIOC.vi to create new EPICS variables and start them. CA Lab - LabVIEW (Realtime) EPICS INPUT: PV set Cluster-array of names, data types and field definitions to crea…

VMware Fusion虚拟机Mac版 安装Ubuntu操作系统教程

Mac分享吧 文章目录 下载镜像地址&#xff1a;[www.macfxb.cn](http://www.macfxb.cn)一、Ubuntu安装完成&#xff0c;软件打开效果二、Mac中安装Ubuntu虚拟机1️⃣&#xff1a;下载镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;虚拟机安装5️…

3.信号量与互斥量

队列:用来传递数据 如果不想传递数据,只是"通知"呢? 这个时候,我们就可以使用"信号量","信号量"的本质:item_size等于 0 的队列 信号量里面有什么呢? 1.一个计数值 2.一个"队伍",就是一个链表:用来记录等待的对应信号量的任务 …

OpenGL笔记二十一之几何类设计

OpenGL笔记二十一之几何类设计 —— 2024-09-16 下午 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记二十一之几何类设计1.运行1.1.立方体运行1.2.球体运行 2.几何类搭建1.立方体分析2.球体分析3.图片资源文件4.关键实现4.1.geometry.h4.2.geometry.cpp…

PCL 曲线点云提取

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 提取曲线点云的方法主要分为两种:参数化与非参数化,其中参数化是指事先直线曲线的形状,反之,非参数化则是不依赖与曲线的参数,通常是一种聚类的行为。这里我们采用非参数方法(TriplClust),将点集划分为一个未…

Redis的配置与优化

目录 一、关系数据库与非关系型数据库 1.1、关系型数据库 1.2、非关系型数据库 1.3、关系型数据库和非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 1.4、非关系型数据库产生背景 二、Redis简介 2.1、Redis优点 2.2、Redis为什么这么快 三、…

如何编写智能合约——基于长安链的Go语言的合约开发

场景设计&#xff1a;文件存证系统 在数字化时代&#xff0c;文件存证和版本追踪变得越来越重要。设想一个场景&#xff1a;在一个法律事务管理系统中&#xff0c;用户需要提交和管理各种文件的版本记录&#xff0c;以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…

数据结构之栈(python)

栈&#xff08;顺序栈与链栈&#xff09; 1.栈存储结构1.1栈的基本介绍1.2进栈和出栈1.3栈的具体实现1.4栈的应用例一例二例三 2.顺序栈及基本操作&#xff08;包含入栈和出栈&#xff09;2.1顺序栈的基础介绍2.2顺序栈元素入栈2.3顺序栈元素出栈2.4顺序栈的表示和实现 3.链栈及…

【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库基本信息数据库配置设置密码控制台开启…