C++ 泛型编程(四) 类模板

2023-11-08

前文回顾:
C++ 泛型编程(一) 基本概念
C++ 泛型编程(二) 函数模版
C++ 泛型编程(三) 模版实参推断

类模版

  1. 定义

    ①.定义

    类模版是用来生成类的蓝图的。类似函数模版的定义,类模板以关键字 template 开始,后跟尖括号包围的模版参数列表,用关键字 typename 来定义模版参数类型。

    template <typename T>
    class A
    {
        A();//   
    };
    

    ②.类模版实例化

    不同于函数模版,编译器无法为类模版推断实参类型,使用时必须显式指定模版类型。一个类模版的每一个实例都是一个独立的类,互相之间没有任何关系。

    template <typename T>
    class A
    {
        A();//   
    };
    A<int> a1;
    A<string> a2;
    
  2. 成员函数

    ①.成员函数定义

    类模版的每个实例都有自己版本的成员函数,因此类模版的成员函数具有和模板相同的模版参数;在类外定义成员函数必须以 template 开始。

    template <typename T>
    class A
    {
        A();//
        void f1(string & s)//类内定义成员函数
        {
            cout << s << endl;
        }
        void f2( int i);
    };
    //类外定义成员函数
    template <typename T>//模版声明
    void A<t>::f2( int i)//指明类型作用域
    {
        cout << i << endl;
    }
    

    ②.类模板头文件

    为了生成一个实例化版本,编译器需要掌握类模版成员函数的定义,因此类模版以及其成员函数都必须在头文件中进行定义。

    ③.成员函数实例化

    对于一个实例化了的类,其成员函数只有在程序用到它时才会被实例化。

    string temp = "hello";
    A<int> a1;//类实例化
    a1.f1(s);//实例化一个成员函数
    
  3. 类模版与友元

    当一个类包含一个友元声明时,类与友元各种是否是模版是互相无关的。如果一个类模版包含一个非模版友元,则友元可以访问所有类模版实例;如果友元自身是模版,类可以授权给所有友元模版实例,也可以只授权给特定实例。

在这里插入图片描述

  1. 默认模版实参

    同函数模版可以定义默认模版实参,类模版也可以为模版参数提供默认实参。类模版的默认实参需要遵循从右向左的规则进行指定。当希望使用默认实参时,在模版名后加空尖括号对即可。

    template <typename T1,typename T2 = int> // T2 默认为 int
    class P
    {
    public:
    	P(T1 m_name, T2 m_age) :name(m_name), age(m_age) {};
    private:
    	T1 name;
    	T2 age;
    };
    P<string> p("张三", 12);// T2 使用默认实参
    
  2. 成员模版

    一个类可以包含本身是模版的成员函数,这种函数称为成员模版;类本身可以是普通的类,也可以是类模版;成员模版不能是虚函数。

在这里插入图片描述

  1. 显式实例化类模版

    同模版函数的显示实例化定义,类也可以用 extern 来声明一个外部的模版定义,即承诺在其他位置有该实例的一个定义;类模版的实例化定义会实例化类的所有成员。

    extern template class P<string,int>;//承诺在其他位置进行了实例化定义
    P<string,int>("张三",12);
    
    #include "test.h"
    //必须为其他位置声明为 extern 的类型提供一个非 extern 定义
    template class P<string,int>;//实例化定义
    

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 泛型编程(四) 类模板 的相关文章

  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 将 log4net 与 Autofac 结合使用

    我正在尝试将 log4net 与 Autofac 一起使用 我粘贴了这段代码http autofac readthedocs org en latest examples log4net html http autofac readthed
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 如何将 Roslyn 语义模型返回的类型符号名称与 Mono.Cecil 返回的类型符号名称相匹配?

    我有以下代码 var paramDeclType m semanticModel GetTypeInfo paramDecl Type Type Where paramDeclType ToString returns System Col
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 使用conda安装了cudatoolkit11.7和cudnn8.6, paddle却报错:Cannot load cudnn shared library. Cannot invoke method

    问题来源 近日 使用paddle官方的conda安装命令安装最新版的paddle conda install paddlepaddle gpu 2 4 1 cudatoolkit 11 7 c https mirrors tuna tsin
  • javascript常用排序算法(图文详解)

    文章目录 冒泡排序 原理 时间复杂度 空间复杂度 稳定性 演示效果 代码实现 选择排序 原理 时间复杂度 空间复杂度 稳定性 演示效果 代码实现 插入排序 原理 时间复杂度 空间复杂度 稳定性 演示效果 代码实现 快速排序 原理 时间复杂度
  • 玩转GitHub!7个实用工具,打造完全不同的GitHub

    全文共2395字 预计学习时长9分钟 图源 freebuf GitHub平台是最受欢迎的版本控制存储库之一 拥有不计其数 多种编程语言编写的公共项目 你可以用它分配团队协作工作 也可以从无数软件项目中一些最常使用的开源库中学习 并见机发表见
  • mysql报错error2002_mysql中异常出错ERROR:2002的处理办法分享

    软件安装 装机软件必备包 SQL是Structured Query Language 结构化查询语言 的缩写 SQL是专为数据库而建立的操作命令集 是一种功能齐全的数据库语言 在使用它时 只需要发出 做什么 的命令 怎么做 是不用使用者考虑
  • 实用的集成学习模型调优策略SWA

    集成学习介绍 强力的集成学习算法主要有2种 基于Bagging的算法和基于Boosting的算法 基于Bagging的代表算法有随机森林 而基于Boosting的代表算法则有Adaboost GBDT XGBOOST 集成学习的思想同样适用
  • ES特定场景性能优化

    1 Overview 本文主要介绍一下Elasticsearch 后文简称ES 做相关基准测试的流程 及分享一些我们做过的一些测试结论 简要说明下我们使用情况 宽表的用户画像OLAP分析场景 集群规模200节点 数据量30T左右全热数据 2
  • java设置超链接字体大小_(四十八)Android TextView中文字通过SpannableString来设置超链接、颜色、字体等属性...

    1 程序结构图 2 MainActivity java中的代码 packagecom example setlinkdemo importjava io IOException importorg xmlpull v1 XmlPullPar
  • windows10解决“引用的账户当前已锁定”问题

    背景 多次输入密码之后 提示 引用的账户当前已锁定 可能无法登录 怀疑是多次输入错误的密码导致的 适用场景 多次输错密码之后 想起自己正确的密码 解决方案 按住 shift 的同时 点击关机图标 右下角 后选择 重启 进入 选择一个选项 界
  • wpf基于DevExpress实现折线图的两种方法

    以上为简单实现效果 具体需要什么样式需要自己再去好好调试 WPF实现折线图一般有三种方法 XAML文件 XAML C 代码 C 代码 今天主要结束前二者 方法一 XAML实现
  • python变量与常量

    变量与常量 一 什么是变量 变量就是指可以变化的量 量指的是事物的状态 比如人的年龄 性别 身高 体重 变量有三大组成部分 变量名 赋值符 变量值 变量名 指向赋值符右侧值的内存地址 通过内存地址去访问实际的值 赋值符 将变量值的内存地址绑
  • 二叉树——求两个节点的最近公共祖先

    题目 给定一颗二叉树的头结点 和这颗二叉树中2个节点n1和n2 求这两个节点的最近公共祖先 思路 利用后序遍历实现 对于当前节点cur 如果节点为null或者等于n1或n2中的一个 则直接返回cur 先处理左右子树 左子树返回left 右子
  • python编写一个函数判断一个数是否为偶数_26 python语言编写判断奇数偶数 动态输出菱形 eval函数编写一个控制台版的计算器...

    练习题 判断奇数偶数 1 编写Python程序 实现判断变量x是奇数还是偶数的功能 2 改写第1题 变量x需要从Python控制台输入 第1题 coding utf 8 x 5 a x 2 print a if a 0 print x的值为
  • python yuv转rgb

    注意 yuv 也有很多种格式 cv2 COLOR YUV2BGR NV12 对应的格式 所有格式C https docs opencv org 4 2 0 d8 d01 group imgproc color conversions htm
  • PHP实现苹果(IOS)内购(IAP)

    反反复复经过多次重写 内部需要 发现苹果使用PHP来验证苹果内购数据是否正确并不是一件很难的事情 我把我的一些心得写出来 以供以后有这方面需求的小伙伴参考 以PHP语言为例 谁让PHP是最好的语言呢 首先要知道苹果内购分沙箱环境和正式环境
  • Hyperledger Fabric1.0架构概览

    Hyperledger是被业界非常看到的联盟链的实现 包括IBM Intel R3 各个大型商业银行等都参与其中 带给我们关于区块链技术与软件工业 金融 保险 物流等领域碰撞结合的想象空间 在这个联盟中 有超过1 4的成员都来自中国 这更是
  • java虚拟机运行时分布区域

    概述 本文将从概念上介绍java虚拟机内存的各个区域 讲解这些区域的作用 服务对象以及其中可能产生的问题 运行时数据区域 java虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器 程序计数器是一块较小的内存空间 它可以看作是当前
  • 动态规划之二维0-1背包问题(思考分析、解决、算法模板)

    一 问题描述 二维费用的背包问题是指对于每件物品 具有两种不同的费用 选择这件物品必须同时付出这两种代价 对于每种代价都有一个可付出的最大值 背包容量 求选择物品可以得到最大的价值 设第i件物品所需的两种代价分别为v i 和u i 两种代价
  • SiT9102:1-220MHz任意频率差分晶振,LVPECL/LVDS/HSCL/CML

    1 SiT9102简介 SiT9102差分晶振是1 220MHz之间任意频点 抖动 lt 1ps 输出支持LVDS LVPECL CML HCSL的高性能差分振荡器 频率稳定度高达 10ppm SiT9102得到了以XiLinx 为代表的主
  • 数据预处理之缺失值

    目录 0 前言 1 缺失值的识别 1 1 每个数据的识别 isnull 1 2 每列 行是否包含缺失值 isnull any isnull all 1 3 缺失值的个数 isnull sum 1 4 检查所有的数据 data info 1
  • C++ 泛型编程(四) 类模板

    前文回顾 C 泛型编程 一 基本概念 C 泛型编程 二 函数模版 C 泛型编程 三 模版实参推断 类模版 定义 定义 类模版是用来生成类的蓝图的 类似函数模版的定义 类模板以关键字 template 开始 后跟尖括号包围的模版参数列表 用关