C++模板的使用以及常见问题
最近的数据结构实验频繁地遇到了模板,之前对这一块接触不多,遇到了很多问题,放到这里总结一下。
- 模板的声明有两种:template <typename Type>或者template<class Type>。虽然建议使用typename以避免二义性,但是这两种实际上是都可以的
- 模板只作用于其下方的一个类或者函数,所以在类外实现成员函数时要对每一个函数都在之前进行模板的声明(即使如果这个函数没有用到这个模板类型,但是类名里也要加上<Type>)
- 与普通函数和类不同,模板函数或类在其他类作为友元之前必须先进行声明(不用定义,声明即可),否则无法通过编译,例如:
template<typename T>class BinaryTree;
template<typename T>
class BinaryTreeNode {//define the node of binary tree
friend class BinaryTree<T>;
//friend class BinarySearchTree<T>;如果不加入第一行,则无法通过编译。
- 在同一个类或者函数中可以使用多个模板,放在一条语句中声明即可:template<typename T1,T2>。
- 模板类和函数在实例化时。注意不能使用new语句,而应采用 类名<具体类型名>具体类或者函数的名称。这一点在初学时很容易犯。
- 在同一个文件的不同类中可以使用多个模板,例如对class a,我们使用了模板T1,对于class B,我们可以使用模板T2,完全没有问题。不仅如此,在实例化时,可以把一个类的模板类型实例化为另一个模板类或者与其有关的类型。例如,定义链队列类时:
template <typename Type>
class LinkQueueNode {定义二叉树类时:
template<typename T>
class BinaryTree {而在二叉树的一个成员函数中,我们可以使用:
void BinaryTree<T>::LevelOrder(BinaryTreeNode<T>*root)
{
/*二叉树的层序遍历*/
LinkQueue<BinaryTreeNode<T>*>tQueue;//链队列,节点类型为二叉树节点指针类型注意这里把链队列的类型实例化为了二叉树节点类指针的类型!这样,在最后将二叉树类型实例化时,使用链队列对象就完全没有问题。
- 对于使用了模板的类要注意,定义成员函数时,类型名之后都要加<T>,其他和普通成员函数的定义完全一样,尤其在类外定义时不要出错。
C++模板的使用以及常见问题的更多相关文章
- LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...
- eclipse 常见问题之字体更改、添加注释模板
有些同学可能会和我有一样的困扰,每次想要更改字体大小.背景颜色等,都需要百度一下才知道怎么去做...不知道有没有这种情况的孩子,反正我经常遇到,老是记不住,今天写下来,顺带自己忘记的时候可以查看一下. ...
- tp5 常见问题 模板文件 路由
W:视图 Q:是MVC中的V,也就是在模块下面的view目录下的html文件,就是写的页面. W:模板 Q:视图在控制器的叫法,在fetch,display等方法中传入的模板参数 最后传到视图. ...
- c++模板使用及常见问题
一.为什么使用模板?? 使用模板的目的是为了避免重复声明和定义一系列基本功能相同的函数或者类,其区别因传入参数的不同而产生不同类型的数据,其基本工作过程都是一致的! 二.调用模板函数产生不明确问题 ( ...
- C++面试常见问题——17类模板的使用
类模板的使用 注意在每次类模板函数时都需要声明一个类模板 #include<iostream> using namespace std; template <class T,int ...
- C++面试常见问题——16函数模板的使用
函数模板的使用 函数模板在使用之前必须在外部对函数模板进行初始化. 函数模板的实例化包含两中 1.隐式实例化: template <class T> //没有: T Fun(T a,T b ...
- 翻译:常见问题——ABAP Development Tools for Eclipse
ABAP Development Tools for Eclipse(简称ADT)是一个基于Eclipse的全新ABAP IDE,这篇文档试图回答有关ADT的最重要的常见问题.这只是一个开始,如果你对 ...
- h5移动端常见问题
meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 1 <meta name="viewport" content="width=device-w ...
- OC基础--Xcode 模板修改和文档安装
修改项目模板 项目模板就是创建工程的时候选择的某一个条目, Xcode会根据选择的条目生成固定格式的项目 如何修改项目模板 找到Xcode, 右键"显示包内容" 打开"/ ...
随机推荐
- linux deb系 rpm系 配置永久IP
rpm: 1.IP a 查看网卡名 ens256 2.uuidgen ens256 生成UUID 3./etc/sysconfig/network-scripts add ifcfg-ens256 4 ...
- 20165223 学习基础和C语言基础调查
一.学习基础 1. 我所擅长的技能 从小我就对新鲜事物抱有浓厚的兴趣,因此多年来培养了许多爱好,对感兴趣的诸如绘画方面的国画.油画.素描.漫画等:音乐方面的钢琴.吉他.架子鼓等:运动方面的滑板.溜冰. ...
- springboot jar包运行中获取资源文件
1. 今天晚上写了一个程序,基于Spring boot的一个小网站,发现使用FileUtils.class.getResource(path)来获取jar包中的资源文件并不能成功,其路径很奇怪 fil ...
- JDK8中的并行流
1.IntStream.parallel():获取并行流处理 2. Collection中调用parallelStream()获取并行流 3.并行排序Arrays.parallelSort()
- 【模板】多项式乘法(FFT)
题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示F(x)的系 ...
- [luogu3388][割点]
题目链接 思路 真板子题.割点是指在一个无向图中,删去之后图将不再连通的点.可以用tarjan算法求.根据割点有两种情况,一种是根,一种是非根.如果不是根的就去判断在tarjan的时候当前节点所能到的 ...
- MongoDB 学习记录(一)
前言:之前一直只是简单了解MongoDB,而且是随便看看的那种,今天决定好好的整理一下,以便自己能 温故而知新 1.MongoDB是什么 MongoDB 是一个高性能,开源,无模式的文档型数据库,开 ...
- laravel基于redis实现的一个简单的秒杀系统
说明:网上很多redis秒杀系统的文章,看的都是一头雾水,然后自己来实现一个,也方便以后自己学习 实现的方式是用的redis的list队列,框架为laravel 核心部分为list的pop操作,此操作 ...
- bcftools合并vcf文件
见命令: bcftools merge A.vcf.gz B.vcf.gz C.vcf.gz -Oz -o ABC.vcf.gz 参考链接:http://vcftools.sourceforge.ne ...
- Unity 物体移动的理解
Unity通过内置的Input类获取外部输入,具体查看: Editor---Project Setting---Input,常见的输入比如:Vertical.Horizontal.Fire1.Jump ...