当前位置: 首页 > news >正文

[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.lryc.cn/news/410114.html

相关文章:

  • 嵌入式C++、STM32、树莓派4B、OpenCV、TensorFlow/Keras深度学习:基于边缘计算的实时异常行为识别
  • C++ //练习 15.30 编写你自己的Basket类,用它计算上一个练习中交易记录的总价格。
  • 3个方法快速找回忘记的PDF文件密码
  • 排序算法:选择排序,golang实现
  • 【测试】博客系统的测试报告
  • PointCLIP: Point Cloud Understanding by CLIP
  • 搜索(剪枝)
  • python基础知识点
  • Android SurfaceFlinger——GraphicBuffer获取内存信息(三十一)
  • 基于 SASL/SCRAM 让 Kafka 实现动态授权认证
  • 通用多级缓件组件
  • MindIE Service服务化集成部署通义千问Qwen模型
  • chrome 接口请求等待时间(installed 已停止)过长问题定位
  • HDialog特殊动画效果
  • 基因组挖掘指导天然药物分子的发现-文献精读34
  • hcip学习 DHCP中继
  • [Mysql-函数、索引]
  • org.eclipse.jgit 简单总结
  • Fork软件笔记:一键拉取仓库所有模块
  • 常见的锂电保护芯片 单节锂电保护/双节锂电保护芯片
  • 初识Java(六)
  • Spring-原理篇-DispatcherServlet 初始化 怎么和IOC进行了打通?
  • 关于swift- OC混编使用Pod遇到的2个错误
  • Golang | Leetcode Golang题解之第290题单词规律
  • 【Django5】模型定义与使用
  • HTML--JavaScript操作DOM对象
  • Redis 缓存
  • Prozyme糖样本检测平台--GlykoPrep® Rapid N-Glycan Preparation with APTS
  • 力扣面试题(一)
  • Python 输入输出