模板(二)

目录

非类型模板参数

引入

分类

使用typename的特殊情况

注意点 

模板特化

引入

介绍

函数模板特化 

使用

​编辑

优点

类模板特化 

全特化

偏特化

部分特化

特殊的特化 

使用

分离编译

介绍

问题代码示例 

代码

说明

预处理

编译

链接

类模板实例化原理

总结

解决方法 

显式实例化

声明和定义放在一个头文件


非类型模板参数

引入

一般我们使用模板都是想让这个类兼容更多的类型,但模板参数不止只有这个作用

分类

模板参数分为 类型形参 非类型形参
  • 类型形参 : 出现在模板参数列表中,跟在class或者typename之后的参数类型名称(这两个一般情况下可以随意使用,但在某些情况下只能使用typename)
  • 非类型形参 : 就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用(eg: 定义数组大小)

使用typename的特殊情况

  • 当我们需要使用一个类里的类型时, 就得使用::来指明该类型所属的类名
  • 但在编译期间,编译器是不知道这个东西到底是一个类型,还是一个静态成员变量(根据语法来说,静态成员变量也可以被这样调用)
  • 如果这里是变量,我们用变量作为类型来创建变量,那语法就错误了
  • 而这里仅仅只是类名,并没有实例化,编译器无法通过代码判断是否合规(没有实例化就找不到对应的代码)
  • 所以为了安抚(?)编译器,需要在类名的前面 + typename,来告诉编译器,这里是一个类型,不要觉得有语法错误 ,具体等实例化后去类里找就行

注意点 

  1. 浮点数、类对象以及字符串 " 是不允许作为非类型模板参数的,只能是整型(最初创造出来就是为了处理大小啥的)
  2. 非类型的模板参数必须在编译期就能确认结果,C++的模板机制要求 -- 编译器在编译期间就生成模板的实例化代码,而这些代码的生成需要基于已知的、在编译期就可以确定的参数值

模板特化

引入

之前在优先级队列中,我们有使用仿函数实现比较函数

当时如果传入参数是自定义类型时,需要我们另写一种比较函数,但也可以采用另外一种方法 -- 函数模板特化

介绍

特化是在原模板类的基础上,针对特殊类型 所进行特殊化的实现方式
模板特化分为 -- 函数模板特化 与 类模板特化

函数模板特化 

使用

 

 在需要特化的函数名后 + <特化的类型>,这样这里就不需要T类型,但仍需要写tmplate<>

优点

按照原先的方法,直接给出对应函数,那么可能在传参的时候就费劲点,可能需要把所有参数都给出

但如果有函数特化,就不需要传入后两个参数,直接传类型就够了(因为此时函数名仍是当时给出的缺省参数)

类模板特化 

写法是一样的,只不过针对的对象不一样,一个是函数,一个是类

全特化

将类的所有模板参数都进行特化(都给出具体类型)

偏特化

部分特化

将模板参数类表中的一部分参数特化

特殊的特化 

可以将普通类型特化成该类型的指针/引用版本

使用

之前这样的类无法将自定义类型的指针传入进行比较(因为我们要的是比较对象),所以我们是另写了一个新类来完成该功能

但现在我们也可以使用特化的方式来实现

分离编译

介绍

分离编译是一种编程技术,允许将程序代码分割成多个文件,每个文件可以独立地编译成目标文件(.o文件),然后将这些目标文件链接在一起, 来创建最终的可执行程序

分离编译的核心思想 -- 是将代码逻辑分解为多个独立的模块,每个模块可以单独编译,从而减少了重新编译整个项目的需要 

问题代码示例 

一般来说,分离编译虽然很方便,但也很容易出现不少问题

代码

比如下面的三个文件

stack.h:

 stack.cpp:

main.cpp:

说明

预处理

在这三个文件形成可执行文件的过程中,首先是在两个cpp文件中,将.h文件展开... ,形成.i文件

编译

  • 这样stack.i中,有stack类的声明和定义,还有A类的func1定义 ; 但main.i中只有stack类的所有声明+部分定义 , 和A类的所有声明
  • 所以在编译阶段,只能确定 main.i中的size(),以及stack类的构造函数 的地址(这里只是生成了与地址相关的信息,但这些信息还没有映射到最终的绝对地址 , 编译阶段的地址是为后续阶段提供信息的一种中间状态)
  • 以及生成修饰后的函数名
  • 虽然没有确定所有函数的地址,但是编译是可以通过的,因为含有对应函数的声明

接下来生成.o文件

上面这三个阶段,对应生成地址的情况如下图:

链接

  • 接下来就是进行链接,链接是可以将func1的地址确定的,因为func1的定义有在stack.cpp中,俩文件相互一交流(拿着修饰后的函数去符号表找),就可以确定辽
  • 但素,这样的代码会报错,编译器说push在链接中出现问题
  • 原因是在main.s中,push修饰后的函数名适合int有关的(因为实例化传入的类型就是int),但是在stack.s中,没有人告诉他要实例化成什么,所以并没有实际生成代码,只是一个壳子,也就没有什么地址,自然在符号表中找不着

类模板实例化原理

  • 编译器在遇到类模板的使用时,会生成一个用于在实际需要时实例化代码的计划,这个计划称为模板的实例化
  • 这个计划会记录下特定模板参数,以及生成实际代码的需要
  • 在源文件中使用模板时,需要提供模板参数,并创建一个模板的实例 , 这样就会告诉编译器 我们想要使用特定类型来实例化模板
  • 当编译器在编译源文件时,会根据计划生成 特定类型的类代码,其中包含了特定类型的成员函数和数据成员

总结

所以,上面的情况之所以出现问题,就是因为类的具体代码不在当前编译单元中

编译器需要生成实际的代码,但如果实际的代码在其他源文件中,链接器就无法找到这些代码,从而导致链接错误

解决方法 

显式实例化

如果一定要把类的声明和定义放在两个文件,可以采用显式实例化模板的方式

但是坏处就是,一旦使用新的类型实例化模板,就得加代码,hin麻烦

声明和定义放在一个头文件

这样在包括头文件的源文件中,一旦源文件实例化了类,就能及时的在编译过程生成实际代码,然后可以链接成功

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

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

相关文章

期货量化软件:衡量指标信息

机器学习依靠数据训练来学习市场的一般行为&#xff0c;最终做出相当准确的预测。 所选学习算法必须遍历精心挑选的样本&#xff0c;以便提取有意义的信息。 许多人未能成功应用这些精密工具的原因是&#xff0c;大多数有意义的信息都隐藏在嘈杂的数据当中。 对于许多策略开发人…

期货量化交易软软件:怎样开发可以获利的交易策略

简介 通过技术分析开发成功交易策略的过程可以分为以下几步: ​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在某个资产价格图表窗口上附加几个技术指标, 并识别出其中信号指标与市场关联的模式. 把上一步相关性分析取得的数据进行公式化. …

免费期货量化交易软件:种群优化算法引力搜索算法(GSA)

1. 概述 ​​​​​​​ 引力搜索算法&#xff08;GSA&#xff09;是由 E. Rashedi 提出的&#xff0c;用于解决优化问题&#xff0c;特别是非线性问题&#xff0c;它遵循牛顿的万有引力定律原理。 在所提议的算法中&#xff0c;粒子被视为物体&#xff0c;并在考虑其质量的情…

免费_期货量化软件:神经网络变得轻松-网络训练和测试

1. 定义问题 在开始创建智能交易系统之前&#xff0c;必须定义将为新神经网络设定的目标。 当然&#xff0c;金融市场上所有智能交易系统的共同目标是获利。 然而&#xff0c;此目的太笼统宽泛。 赫兹期货量化软件需要为神经网络指定更具体的任务。 甚至&#xff0c;我们需要了…

免费期货量化软件:多层感知器和反向传播算法

免费期货量化软件&#xff1a;多层感知器和反向传播算法 什么是 TensorFlow&#xff1f; TensorFlow 是一个快速数值处理的开源函数库。 它是由 Google 依照 Apache 开源许可下创建、支持和发布。 该 API 是为 Python 语言设计的&#xff0c;尽管它也可以访问基本的 C API。…

免费期货量化软件策略:艾伦·安德鲁斯和他的时间序列分析技术

我相信&#xff0c;所有现代图表分析应用程序都会包括 安德鲁草叉。 在高级系统中&#xff0c;在原本的三条主线中会添加一些额外的线&#xff08;例如&#xff0c;为了更方便&#xff0c;赫兹期货量化中加入了“侧边”等级&#xff09;。 一些开发人员在他们的程序中包括“希夫…

免费期货量化软件:数据科学与机器学习——线性回归

它是一个跨学科领域&#xff0c;它运用科学方法、流程、算法、系统&#xff0c;从嘈杂、结构化和非结构化数据中提取出知识和见解&#xff0c;并将这些知识和可操作的见解在广泛的应用领域加以运用。 数据科学家则是创建编程代码、并将其与统计学相结合&#xff0c;从中挖掘创…

免费期货量化软件策略:在一张图表上的多个指标为用户开发

通常&#xff0c;当我们开始实现一个新系统时&#xff0c;我们并不真正知道我们如何对其进行改进&#xff1b;故此&#xff0c;我们应该始终启动一个新项目&#xff0c;并着眼于未来进行改进。 这对那些刚开始的人来说非常重要&#xff1a;持续地规划一些事情&#xff0c;想象未…

免费期货量化软件策略您能用移动平均线做什么呢?

我们将学习布林带&#xff0c;它测量数据在其平均值附近的离散度。该指标由约翰博林格&#xff08;John Bollinger&#xff09;创造。 它由围绕 20 天移动平均线的两条波段构成&#xff0c;以测量数据&#xff08;价格&#xff09;在其均值&#xff08;20 天移动平均线&#xf…

免费期货量化软件策略:从头开始开发智能交易系统(第 25 部分)

概述 在上一篇文章提供系统健壮性 &#xff08;I&#xff09;中&#xff0c;赫兹期货量化已经看到了如何更改 EA 的某些部分&#xff0c;从而令系统更加可靠和健壮。 这只是针对兹期货量化将要在本文中所做之事的介绍。 请忘记您所知道的、计划的、或希望的一切。 这里最困难…

免费期货量化软件:学习如何设计一款布林带Bollinger Bands交易系统

我们将学习布林带&#xff0c;它测量数据在其平均值附近的离散度。该指标由约翰博林格&#xff08;John Bollinger&#xff09;创造。 它由围绕 20 天移动平均线的两条波段构成&#xff0c;以测量数据&#xff08;价格&#xff09;在其均值&#xff08;20 天移动平均线&#xf…

免费期货量化软件:针对交易的组合数学和概率论曲线分析

赫兹期货量化将继续为构建多重状态、可扩展的交易系统奠定基础。 在本文的框架内&#xff0c;我想为您展示如何利用前几篇文章中的发展成果&#xff0c;来进一步阐述交易过程的广泛可能性。 这有助于从这些层面评估策略&#xff0c;来弥补其它分析方法未能涵盖的地方。 在本文中…

免费期货量化软件:从头开始开发智能交易系统概念上的飞跃

有时&#xff0c;在开发一些项目时&#xff0c;我们也许会发现新的思路和新的可能特性&#xff0c;这些特性能够派上用场&#xff0c;并为我们正在创建的系统提供极大的改进。 但问题出来了&#xff1a;实现新功能的最简单途径是什么&#xff1f; 问题在于&#xff0c;有时我们…

Bugku 密室逃脱 WP

一、打开题目 二、解压文件夹&#xff0c;查看文件和压缩包&#xff0c;发现压缩包进行了加密 三、查看剧本&#xff0c;发现摩斯密码&#xff0c;并解析得到电脑密码&#xff1a;xjpc 四、输入电脑密码得到一张图片和一个压缩包&#xff0c;查看图片发现图片位置发生错误&a…

如何不下载软件来制作自己的网站

注意&#xff1a;本文使用Windows操作系统。如果你计算机的操作系统不是Windows&#xff0c;这篇文章对于你来说没有丝毫意义。 我们前几天介绍了如何建立一个自己的网站&#xff0c;虽然也有用&#xff0c;但是下载了许多软件。Windows系统就自带了一个名为IIS的软件&#xff…

能优化你的网站的网页制作软件

做一个网站也许并不是一件很难的事情&#xff0c;但是想做出漂亮而且极富个性的网站就不那么容易了。这里笔者就给大家介绍几款用于修饰和改造网页的软件&#xff0c;让你的主页效果更炫一些。 有声有色 “有声有色”是给网页添加Java特效的一款软件&#xff0c;它集合了518个十…

搭建个人网站软件安装

搭建个人网站软件安装(均在Root用户下完成) 系统环境为&#xff1a;Centos7.6 参考文献&#xff1a; 在CentOS 7系统上安装PHP 7.4版本的方法 解决CentOS中yum安装程序时出现的"Transaction check error"错误 Centos7下安装MySQL Centos 7下安装配置Nginx Ngi…

个人网站搭建,个人网站需要什么软件

好的网页设计软件通过编码平台或简单的拖放就可以构架一个简单的个人网站。过去的网站建设需要用HTMLCSS和JS来制作。然而随着建站技术越来越成熟&#xff0c;拖放式网页制作工具越来越普遍&#xff0c;任何人都可以轻而易举地搭建自己的个人网站。 在本文中&#xff0c;我们将…

建站软件用什么呢?

建站软件用什么呢&#xff1f;目前网络上有很多建站软件都是可以建网站使用的&#xff0c;企业用户可以根据自己的需求去选。目前网络上建站软件有两种&#xff0c;一种是免费的&#xff0c;另一种是收费的。免费的建设网站软件一般功能是有限制的&#xff0c;只要能够符合用户…