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

news2024/9/21 21:53:08

一、模板的组织结构

之前对于模板,我们都是写在同一个 . 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.coloradmin.cn/o/2142614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

适合骑行的开放式耳机哪个品牌好?四款开放式蓝牙耳机推荐

骑行时是否有必要佩戴耳机是一个需要权衡安全与便利的问题。因为虽然耳机能提供音乐、导航等功能&#xff0c;但也可能分散注意力&#xff0c;影响骑行安全。而且这也是需要看个人需求决定的&#xff0c;骑行戴耳机的需求是什么&#xff0c;我想大部分人应该就是为了接听电话&a…

大端存储与小端存储的存储方式

目录 1.小端存储方式的解释 2.大端存储方式的解释 3.百度笔试题--判断大端存储还是小端存储 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.小端存储方式的解释 小端存储…

DeDeCMS靶场漏洞复现

打开靶场地址 姿势一&#xff1a;通过文件管理器上传webshell 1.登录后台 dedecms默认的后台登录地址为/dede 2.在附加管理里的文件式管理器中有文件上传 3.上传木马文件 4.访问木马文件 并连接 姿势二&#xff1a;修改模板文件获取webshell 1.点击模板里面的默认模板管理 …

【2025】智慧居家养老服务平台的设计与实现、基于AI的居家养老服务平台、居家养老服务平台开发、智慧养老服务平台设计

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

CAS 和 synchronized 的优化过程

&#x1f349; 目录 CAS 的实现 CAS 的工作原理 优化过程 CAS 的应用 1) 实现原子类 2&#xff09;实现自旋锁 CAS 的 ABA 问题 synchronized 的 原理 synchronized 基本特点 加锁工作过程 其他优化操作 1. 锁消除 2. 锁粗化 CAS&#xff08;Compare-And-Swap&…

反编译 AndroidManifest.xml文件-android反编译技术

一、安卓打包后目录 想要查看原来版本配置和关联信息&#xff0c;被打包了&#xff0c;这时候需要工具 AXMLPrinter2.jar 二、反编译环境要求 序号软件说明1java电脑得有java环境2AXMLPrinter2.jarapk中xml解析文件 三、反编译指令 java -jar AXMLPrinter2.jar "C:\Us…

腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 目录 双指针 42.接雨水 283.移动零 11.盛最多水的容器 15.三数之和 哈希 1. 两数之和 49.字母异位词分组 128.最长连续序列 滑动窗…

2024 RSTCONCTF re 部分wp

Unknown Architect DIE查看&#xff0c;RISC_V架构&#xff0c;直接交即可 Duke of the Kingdom 附件拖入jadx 比较简单。脚本 Keypad 附件拖入ida。一共四遍check&#xff0c;都比较简单 Pico-Cypher 文本编辑器打开附件 稍微问一问gpt&#xff0c;得知这是micropython&#x…

数据驱动型营销与开源 AI 智能名片 O2O 商城系统的融合发展

摘要&#xff1a;本文探讨了数据驱动型营销在现代商业中的重要性&#xff0c;阐述了其在消费者管理和产品管理方面的作用。同时&#xff0c;引入“开源 AI 智能名片 O2O 商城系统”&#xff0c;分析其如何与数据驱动型营销相结合&#xff0c;为企业提供更精准的营销决策和更高效…

【Matlab 肌电信号分析】

一、数据预处理 1.1 数据读取 使用matlab从rhd文件中读取原始数据&#xff0c;共64个通道。 1.2 数据滤波 使用 60Hz的Notch filter 和150Hz的高通Butterworth滤波器进行降噪 二、波峰提取 > 每个通道分别根据相应的规则提取出波峰、波谷附近的波形。 三、信号聚类 3.1 降…

win7桌面显示我的电脑,控制面板等

win7桌面显示我的电脑&#xff0c;控制面板等 点击windows图标&#xff0c;一般左下角 右键计算机 选择在桌面显示即可&#xff0c;控制面板也是一样的操作

可自动完成固化、繁琐、重复的工作流程,提高工作效率的智慧快消开源了

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。国产化人工智能“…

1.4 计算机网络的性能指标

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言一、速率二、带宽三、吞吐量四、时延五、时延带宽积六、往返时延&#xff08;RTT&#xff09;七、利用率 前言 计算机网络的性能指标是评估网络效率和效果的关键&#xf…

React学习day07-ReactRouter-抽象路由模块、路由导航、路由导航传参、嵌套路由、默认二级路由的设置、两种路由模式

14、ReactRouter续 &#xff08;2&#xff09;抽象路由模块 1&#xff09;新建page文件夹&#xff0c;存放组件 组件内容&#xff1a; 2&#xff09;新建router文件夹&#xff0c;在其下创建实例 3&#xff09;实例导入&#xff0c;使用 4&#xff09;效果 &#xff08;3&…

CAD图纸加密软件哪个好?10款2024主流CAD图纸加密软件分享!

随着信息安全意识的增强&#xff0c;特别是在工程设计、建筑和制造等领域&#xff0c;保护CAD图纸的安全成为一项重要任务。选择合适的CAD图纸加密软件不仅能确保数据安全&#xff0c;还能提高企业的合规性。以下是2024年主流的10款CAD图纸加密软件&#xff0c;每款软件均有独特…

floodfill算法(二)

目录 一、太平洋大西洋水流问题 1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 3. 解法 &#x1f334;算法思路&#xff1a; &#x1f334;算法代码&#xff1a; 二、扫雷游戏 1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xf…

Java8的Optional简介

文章目录 环境背景方法1&#xff1a;直接获取方法2&#xff1a;防御式检查方法3&#xff1a;Java 8的Optional概述map()测试 flatMap()测试 总结参考 注&#xff1a;本文主要参考了《Java 8实战》这本书。 环境 Ubuntu 22.04jdk-17.0.3.1 &#xff08;兼容Java 8&#xff09; …

samba配置

首先需要在linux上使用命令sudo apt install samba安装samba功能&#xff0c;安装之后&#xff0c;使用命令sudo smbpasswd -a zxy添加samba的密码&#xff0c;我这里使用的是和ubuntu的登陆密码&#xff0c;然后需要编辑samba相关的功能&#xff0c;使用命令sudo vim /etc/sam…

通信工程学习:什么是AN-SMF接入网系统管理功能

AN-SMF接入网系统管理功能 AN-SMF&#xff08;Access Network System Management Function&#xff0c;即接入网系统管理功能&#xff09;是通信网络中接入网&#xff08;AN&#xff09;的一个重要组成部分&#xff0c;主要负责协调和管理接入网内的各种功能和资源。以下是对AN…

【Android Studio】app:compileDebugJavaWithJavac FAILED解决办法

文章目录 问题描述解决办法 问题描述 Task :app:compileDebugJavaWithJavac FAILED The following annotation processors are not incremental: jetified-butterknife-compiler-10.0.0.jar (com.jakewharton:butterknife-compiler:10.0.0). Make sure all annotation processo…