[C++] 模板编程-02 类模板

一 类模板

template <class T或者typename T>

class 类名

{

..........

}

1.1 两种不同的实现

  • 在以下的两种实现中,其实第一种叫做成员函数模板,并不能称为类模板
  • 因为这种实现,我们在调用时,并不需要实例化为Product这个类指定指定特定类型。
// 实现1
class Product
{
public:template<typename T>void setProduct(const T& t){qDebug()<<t;}
};
  • 但下面这种实现才是真正的类模板实现
  • 这种的问题是每次实例化都必须指定类型T,这意味着每个 ProductA 实例都绑定到了一个特定类型上。
template<typename T>
class ProductA
{
public:void setProduct(const T& t){qDebug()<<t;}
};
ProductA<int> procduct;
procduct.setProduct(10);

1.2 优缺点

  • 如果你需要一个类能够处理多种不同类型的数据,并且这些数据类型在设计时是未知的,那么 示例 1 更加合适。
  • 如果你需要一个类只处理一种特定类型的数据,并且希望在类的设计时就明确这一点,那么 示例 2 更加合适。

1.3 类模板类外定义

  • 声明
template<typename T>
class SumTemplate
{
public:T sum(T a, T b);T max(T a, T b);
};
  • 定义:在定义时不但要加载类名的限定符,还要声明模板参数,以及传递模板参数
template<typename T>
T SumTemplate<T>::sum(T a, T b)
{return a + b;
}template<typename T>
T SumTemplate<T>::max(T a, T b)
{return a > b ? a : b;
}

1.4 模板类

  • 实例化的模板也就是模板类,模板类是一个由模板生成的类
    SumTemplate<int> templateA;qDebug()<<templateA.sum(1024,1024);qDebug()<<templateA.max(1024,512);SumTemplate<float> templateB;qDebug()<<templateB.sum(1024,1024);qDebug()<<templateB.max(1024,512);

二 模板类定义不能定义在cpp中

  • 如果我们将模板类定义在cpp中,那么我们就会遇到未定义的错误行为
  • 对于模板类的函数声明和实现必须放在同一个.h里面

2.1 原因 

  • 延迟实例化: 首先当编译器遇到类模板的声明时,并不会为这个类模板创建任何的代码,因为类模板的实例化是在调用它时才会产生对应的代码。
  • 如果成员函数定义位于类模板定义之外,比如在另一个 .cpp 文件中,那么就需要显式地实例化这些成员函数。这是因为编译器在处理模板类实例化时,需要知道成员函数的实现细节。如果没有显式实例化,编译器可能无法找到这些成员函数的定义。(也就是在编译阶段无法知道函数的具体细节)
  • 当成员函数定义直接放在类模板的定义中时,编译器可以在任何实例化该模板类的地方看到这个成员函数的定义。这种方式下,不需要显式实例化成员函数,编译器会在需要的时候自动生成特定类型的版本。

2.2 解决

  • 我们可以提前在.cpp里面显示指定模板类的类型,但这种方式不推荐使用
template class SumTemplate<int>;
template class SumTemplate<float>;

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

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

相关文章

C++程序的UI界面闪烁问题的解决办法总结

Windows C++程序复杂的UI界面要使用多种绘图技术(使用GDI、GDI+、ddraw、D3D等绘图),并要贴图去美化,在窗口移动或者改变大小的时候可能会出现闪烁。下面罗列一下UI界面产生闪烁的几种可能的原因,并给出相应的解决办法。 1、原因一 如果熟悉显卡原理的话,调用GDI函数向屏…

【动态规划】不同路径

不同路径&#xff08;难度&#xff1a;中等&#xff09; AC代码 有点水 class Solution { public:int uniquePaths(int m, int n) {//以m为行&#xff0c;n为列&#xff0c;创建二维数组vector <vector<int>> dp(m1,vector<int>(n1));dp[0][1]1;dp[1][0]1;…

内网渗透—内网穿透工具NgrokFRPNPSSPP

前言 主要介绍一下常见的隧道搭建工具&#xff0c;以此来达到一个内网穿透的目的。简单说一下实验滴环境吧&#xff0c;kali作为攻击机&#xff0c;winserver2016作为目标靶机。 kali 192.168.145.171 winserver2016 10.236.44.127 显然它们处于两个不同的局域网&#xff0c…

Android 软键盘挡住输入框

Android原生输入法软键盘挡住输入框,网上各种解法,但不起效。 输入框都是被挡住了,第二张图的小点,实际就是输入法的光标。 解法: packages\inputmethods\LatinIME\java\res\values-land config.xml <!-- <fraction name="config_min_keyboard_height"&g…

第12周 分布式锁:Redisson框架应用(❤❤❤❤❤)

第12-2周 Redisson分布式锁框架 1. 整合Redisson1.1 依赖1.2 方式一:通过配置类配置Redisson1.3 应用简单应用看门狗模式可重入锁公平锁联锁红锁(已弃用)读写锁信号量(限流作用)闭锁**********************************************************官方文档 1. 整合Redisson 1.1…

JavaWeb--Servlet和JSP的基本使用

JavaWeb--Servlet和JSP的基本使用 文章说明servlet和jsp的发展历程最早的手动拼接html页面的servlet使用示例采用jsp技术进行交互与展示页面标签jsp与servlet共同使用、分层处理示例项目下载 文章说明 介绍了javaWeb中Servlet和JSP的基本使用&#xff0c;尽管它们的技术相对比较…

【python中级】 pyinstaller打包可执行程序的说明

【python中级】 pyinstaller打包可执行程序的说明 1.背景2.文档3.总结1.背景 相关博客: 【python中级】 pyinstaller打包python应用程序(1) https://blog.csdn.net/jn10010537/article/details/111058613【python中级】 pyinstaller打包cv.dnn.readNet(xml,bin)推理代码失…

Spring Boot集成Redis与Lua脚本:构建高效的分布式多规则限流系统

文章目录 Redis多规则限流和防重复提交记录访问次数解决临界值访问问题实现多规则限流先确定最终需要的效果编写注解&#xff08;RateLimiter&#xff0c;RateRule&#xff09;拦截注解 RateLimiter 编写lua脚本UUID时间戳编写 AOP 拦截 总结 Redis多规则限流和防重复提交 市面…

Unity在虚拟现实(VR)游戏开发中的优势

Unity引擎是一个功能强大的游戏开发平台&#xff0c;它在虚拟现实(VR)游戏开发中展现出了许多显著的优势。以下是Unity在VR游戏开发中的主要优势&#xff1a; 跨平台支持 Unity引擎支持将游戏部署到多个平台&#xff0c;包括PC、控制台、移动设备、VR/AR设备等。这种跨平台能…

在CentOS 7上安装和使用PostgreSQL的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 关系数据库管理系统是许多网站和应用程序的关键组成部分。它们提供了一种结构化的方式来存储、组织和访问信息。 PostgreSQL&…

每天一个数据分析题(四百五十)- 数据清洗

数据在真正被使用前需进行必要的清洗&#xff0c;使脏数据变为可用数据。下列不属于“脏数据”的是&#xff08;&#xff09; A. 重复数据 B. 错误数据 C. 交叉数据 D. 缺失数据 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据…

非线性校正算法在红外测温中的应用

非线性校正算法在红外测温中用于修正传感器输出与实际温度之间的非线性关系。红外传感器的输出信号&#xff08;通常是电压或电流&#xff09;与温度的关系理论上是线性的&#xff0c;但在实际应用中&#xff0c;由于传感器特性的限制&#xff0c;这种关系往往呈现出非线性。非…

好书推荐 -- 《精通推荐算法》

新书发布&#xff0c;京东限时15天内5折优惠&#xff0c;半天即可送到。 图书封底有读者微信群&#xff0c;作者也在群里&#xff0c;任何技术、offer选择和职业规划的问题&#xff0c;都可以咨询。 《精通推荐算法》&#xff0c;限时半价&#xff0c;半日达https://u.jd.com…

以flask为后端的博客项目——星云小窝

以flask为后端的博客项目——星云小窝 文章目录 以flask为后端的博客项目——星云小窝前言一、星云小窝项目——项目介绍&#xff08;一&#xff09;二、星云小窝项目——项目启动&#xff08;二&#xff09;三、星云小窝项目——项目结构&#xff08;三&#xff09;四、谈论一…

禁忌搜索算法(Tabu Search,TS)及其Python和MATLAB实现

禁忌搜索算法是一种现代启发式搜索方案&#xff0c;主要用于解决组合优化问题。该算法由George F. Lugeral于1986年首次提出&#xff0c;旨在增强局部搜索算法的性能&#xff0c;避免其陷入局部最优解。禁忌搜索利用一个称为“禁忌表”的数据结构&#xff0c;记住最近访问的解决…

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…

【HDFS】HADOOP-11552.Allow handoff on the server side for RPC requests

今天来分析一下 HADOOP-11552. Allow handoff on the server side for RPC requests. 这个之前没有使用场景,也没有细看,所以一直不明白它到底是做什么的? 最近在做Router RPC异步化,涉及到这个feature的使用,因此决定深入学习一下,特此记录。 根据ISSUE的描述,HDFS的…

Laravel Horizon:队列管理与监控的高级指南

引言 在现代Web应用开发中&#xff0c;任务队列是一个常见的需求&#xff0c;用于处理耗时的任务异步执行。Laravel提供了一个强大的队列系统&#xff0c;而Horizon是Laravel的一个扩展包&#xff0c;专门用于管理和监控队列。Horizon不仅提供了一个美观的Web界面来监控队列&a…

web学习笔记(八十三)git

目录 1.Git的基本概念 2.gitee常用的命令 3.解决两个人操作不同文件造成的冲突 4.解决两个人操作同一个文件造成的冲突 1.Git的基本概念 git是一种管理代码的方式&#xff0c;广泛用于软件开发和版本管理。我们通常使用gitee&#xff08;码云&#xff09;来云管理代码。 …

重生之我当程序猿外包

第一章 个人介绍与收入历程 我出生于1999年&#xff0c;在大四下学期进入了一家互联网公司实习。当时的实习工资是3500元&#xff0c;公司还提供住宿。作为一名实习生&#xff0c;这个工资足够支付生活开销&#xff0c;每个月还能给父母转1000元&#xff0c;自己留2500元用来吃…