【C++】模板

news2024/12/23 9:50:15

模板

  • 一、非类型模板参数
  • 二、模板的特化
    • 2.1 函数模板的特化
    • 2.2 类模板的特化
      • 2.2.1 全特化
      • 2.2.2 偏特化
  • 三、模板的分离编译

一、非类型模板参数

模板参数分为类型形参非类型形参
类型形参:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

就比如说我们需要一个动态数组的时候:

template <class T, size_t N = 10>
class Arr
{
private:
	T a[N];
};

注意:

1️⃣ 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2️⃣ 非类型的模板参数必须在编译期就能确认结果。

二、模板的特化

2.1 函数模板的特化

class Stu
{
public:
	Stu(const char* name, int age)
		: _age(age)
	{
		strcpy(_name, name);
	}

	bool operator<(Stu& s)
	{
		return _age < s._age;
	}
private:
	char _name[5];
	int _age;
};

template <class T>
bool Less(T a, T b)
{
	return a < b;
}

int main()
{
	Stu s1("a", 10), s2("b", 20);
	cout << Less(s1, s2) << endl;
	return 0;
}

但是如果要这么比较:

cout << Less(&s1, &s2) << endl;

这里就需要模板的特化

template <class T>
bool Less(T a, T b)
{
	return a < b;
}

// Less 的特化
template <>
bool Less<Stu*>(Stu* a, Stu* b)
{
	return *a < *b;
}

要注意这个是上面模板函数的特化,不能单独写。

2.2 类模板的特化

2.2.1 全特化

全特化即是将模板参数列表中所有的参数都确定化

template <class T1, class T2>
class A
{
public:
	A()
	{
		cout << "<T1 T2>" << endl;
	}
private:
	T1 a;
	T2 b;
};

template<>
class A<double, double>
{
public:
	A()
	{
		cout << "<double, double>" << endl;
	}
};

int main()
{
	A<int, int> a;
	A<double, double> b;
	return 0;
}

在这里插入图片描述

2.2.2 偏特化

template <class T1, class T2>
class A
{
public:
	A()
	{
		cout << "<T1 T2>" << endl;
	}
private:
	T1 a;
	T2 b;
};

// 偏特化
template<class T>
class A<T, char>
{
public:
	A()
	{
		cout << "<T, double>" << endl;
	}
};

三、模板的分离编译

当我们在头文件声明模板函数,而在源文件定义模板函数

// a.h
template<class T>
T Add(const T& left, const T& right);
// a.cpp
template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

这样运行起来会出现链接错误:

在源文件编译的时候,Add函数没有实例化,因此没有生成函数。但是编译器链接的时候会去找函数的地址,但是函数没有实例化没有地址,所以会出现链接错误

解决办法:

1️⃣ 将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的。推荐使用这种。
2️⃣ 模板定义的位置显式实例化。这种方法不实用,不推荐使用

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

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

相关文章

为什么 Go 不支持 []T 转换为 []interface

在 Go 中&#xff0c;如果 interface{} 作为函数参数的话&#xff0c;是可以传任意参数的&#xff0c;然后通过类型断言来转换。 举个例子&#xff1a; package mainimport "fmt"func foo(v interface{}) {if v1, ok1 : v.(string); ok1 {fmt.Println(v1)} else if…

【测试设计】使用jenkins 插件Allure生成自动化测试报告

前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告&#xff0c;后来也尝试过用Python的PyH模块自己构建测试报告&#xff0c;在后来看到了RobotFramework的测试报告&#xff0c;感觉之前用的测试报告都太简陋&#xff0c;它才是测试报告应该有的样子。也就是在…

【01Studio MaixPy AI K210】25.云训练模型文件

采集数据 根据它云训练平台的要求&#xff0c;它要求的图片格式必须是224*224的&#xff08;重点之重点&#xff09;&#xff0c;所以可以利用K210跑脚本直接采集数据。 数据采集脚本 main.py实验名称&#xff1a;照相机 说明&#xff1a;通过按键拍照并在LCD上显示&#xff08…

windows自建免费无限的开源图片识别公式转换为Latex

一、准备 python3.9.6下载 在最开始勾选添加环境变量 https://www.python.org/ftp/python/3.9.6/python-3.9.6-amd64.exe 验证&#xff0c;右键终端&#xff08;管理员&#xff09;&#xff0c;输入&#xff1a;python --version安装Anaconda https://mirrors.bfsu.edu.cn/ana…

算法拾遗二十五之暴力递归到动态规划三

算法拾遗二十五之暴力递归到动态规划三最长回文子串返回象棋从一个位置到另一个位置的方法有多少种返回咖啡机从开始到干净的最短时间最长回文子串 测试链接&#xff1a;https://leetcode.cn/problems/longest-palindromic-subsequence/ 子序列&#xff1a;是可以不连续的 子…

kafka基本概念、springboot整合kafka、kafka常见问题

kafka基本概念 Kafka是一种高吞吐量、分布式、基于发布/订阅的消息系统。 基本概念&#xff1a; broker&#xff1a;就是一个kafka服务&#xff0c;可以有多个broker形成集群 toptic&#xff1a;每个broker里面可以有若干个toptic&#xff08;类似于标签&#xff0c;将消息分…

从Bug中学习--Bug根因分析法

从Bug中学习--Bug根因分析法 目录&#xff1a;导读 1、认识Bug 2、Bug的发现 3、Bug的产生 4、Bug的改进 5、总结 一提起测试&#xff0c;大多数人很容易就会联想到Bug。的确&#xff0c;测试的日常工作离不开Bug&#xff0c;测试工作很重要的一部分就是发现Bug。但是&#xf…

Coraza:一款功能强大的企业级OWASP Web应用程序防火墙

关于Coraza Coraza是一款功能强大的企业级OWASP Web应用程序防火墙框架&#xff0c;该工具基于Golang开发&#xff0c;不仅支持Modsecurity的Seclang语言&#xff0c;而且能够100%兼容OWASP核心规则集。 该工具完全开源&#xff0c;任何开发人员都可以根据自己的需求轻松完成…

GPDB中AOCO列存页的checksum

GPDB中AOCO列存页的checksum为了保证数据的正确性&#xff0c;AOCO列存页采用CRC32即循环冗余校验算法来进行校验。首先看下页结构。页类型有四种&#xff1a;AOSmallContentHeader、AOLargeContentHeader、AONonBulkDenseContentHeader和AOBulkDenseContentHeader。页头的大小…

【初阶数据结构】——详解几个常见的经典排序算法

文章目录1. 排序的概念及其运用1.1 排序的概念1.2 排序的应用1.3 常见的排序算法2. 插入排序2.1 直接插入排序算法思想举例&#xff08;升序&#xff09;代码实现直接插入排序特性总结2.2 希尔排序( 缩小增量排序 )算法思想代码实现希尔排序特性总结3. 选择排序3.1 直接选择排序…

Hadoop基础之《(7)—Hadoop三种运行模式》

一、hadoop有三种运行模式 1、本地模式 数据存储在linux本地&#xff0c;不用 2、伪分布式集群 数据存储在HDFS&#xff0c;测试用 3、完全分布式集群 数据存储在HDFS&#xff0c;同时多台服务器工作。企业大量使用 二、单机运行 单机运行就是直接执行hadoop命令 1、例子-…

AntV结合Vue实现导出图片功能

一、业务场景&#xff1a; AntV 组织图操作完毕以后&#xff0c;需要点击按钮将画布以图片的形式导出 二、问题描述&#xff1a; 官网上有4个方法&#xff0c;我用的是 graph.toFullDataURL(callback, type, imageConfig) 三、具体实现步骤&#xff1a; &#xff08;1&#x…

Three.js纹理投影简明教程

纹理投影是一种将纹理映射到 3D 对象并使其看起来像是从单个点投影的方法。 把它想象成投射到云上的蝙蝠侠符号&#xff0c;云是我们的对象&#xff0c;蝙蝠侠符号是我们的纹理。 它用于游戏和视觉效果&#xff0c;以及创意世界的更多部分。 工具&#xff1a;使用 NSDT场景编辑…

Linux 入门教程||Linux 简介||Linux 安装

Linux 简介 Linux内核最初只是由芬兰人李纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。…

pdf文件怎么压缩?pdf文件变小的简单方法

工作中&#xff0c;pdf文件的使用是非常广泛的&#xff0c;一些特殊的场景下对于pdf文件的大小是有着严格规定的&#xff0c;所以pdf文件压缩成了必备的一项技能&#xff0c;那么怎么将pdf压缩&#xff08;https://www.yasuotu.com/pdfyasuo&#xff09;呢&#xff1f;下面介绍…

一个完整的渗透学习路线是怎样的?如何成为安全渗透工程师?

前言 1/我是如何学习黑客和渗透&#xff1f; 我是如何学习黑客和渗透测试的&#xff0c;在这里&#xff0c;我就把我的学习路线写一下&#xff0c;让新手和小白们不再迷茫&#xff0c;少走弯路&#xff0c;拒绝时间上的浪费&#xff01; 2/学习常见渗透工具的使用 注意&…

2023年江苏建筑安全员精选真题题库及答案

百分百题库提供建筑安全员考试试题、安全员证考试真题、安全员证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 250.施工升降机防坠安全器在装机使用时,应按吊笼额定载重量进行坠落试验,以后至少()个月应进行一次额定载重量的坠落试验 …

辨析Web Service, SOAP, REST, OData之间的关系与区别

最近发现&#xff0c;对于刚刚接触HTTP服务的同学&#xff0c;在一些基础概念上容易混乱。很多同学搞不清楚Web Service&#xff0c;SOAP&#xff0c;REST以及OData这些技术之间的关系与区别。文本会尽量用最简洁的方式&#xff0c;解释这几个概念&#xff0c;并附上一些资料的…

第一章:在Mac OS上安装Go语言开发包

各位朋友们大家好&#xff01; 本节主要为大家讲解如何在Mac OS上安装Go语言开发包&#xff0c;大家可以在Go语言官网下载对应版本的的安装包&#xff0c;如下图所示。 安装Go语言开发包 Mac OS 的Go语言开发包是 .pkg 格式的&#xff0c;双击我们下载的安装包即可开始安装。…

I.MX6ULL内核开发1:内核模块实验

目录 一、实验环境 二、编译4.19.35版内核 1、下载linux内核源码 2、安装必要的环境工具库 3、一键编译内核 4、获取编译出来的内核相关文件&#xff08;与makefile文件一致&#xff09; 三、内核模块代码分析 1、内核模块头文件 2、内核模块打印函数 3、文中语法分析…