最近的数据结构实验频繁地遇到了模板,之前对这一块接触不多,遇到了很多问题,放到这里总结一下。

  1. 模板的声明有两种:template <typename Type>或者template<class Type>。虽然建议使用typename以避免二义性,但是这两种实际上是都可以的
  2. 模板只作用于其下方的一个类或者函数,所以在类外实现成员函数时要对每一个函数都在之前进行模板的声明(即使如果这个函数没有用到这个模板类型,但是类名里也要加上<Type>)
  3. 与普通函数和类不同,模板函数或类在其他类作为友元之前必须先进行声明(不用定义,声明即可),否则无法通过编译,例如:
    template<typename T>class BinaryTree;
    template<typename T>
    class BinaryTreeNode {//define the node of binary tree
    friend class BinaryTree<T>;
    //friend class BinarySearchTree<T>;

    如果不加入第一行,则无法通过编译。

  4. 在同一个类或者函数中可以使用多个模板,放在一条语句中声明即可:template<typename T1,T2>。
  5. 模板类和函数在实例化时。注意不能使用new语句,而应采用 类名<具体类型名>具体类或者函数的名称。这一点在初学时很容易犯。
  6. 在同一个文件的不同类中可以使用多个模板,例如对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;//链队列,节点类型为二叉树节点指针类型

    注意这里把链队列的类型实例化为了二叉树节点类指针的类型!这样,在最后将二叉树类型实例化时,使用链队列对象就完全没有问题。

  7. 对于使用了模板的类要注意,定义成员函数时,类型名之后都要加<T>,其他和普通成员函数的定义完全一样,尤其在类外定义时不要出错。

C++模板的使用以及常见问题的更多相关文章

  1. LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

    作者:HelloGitHub-小鱼干 在众多的诸如阿里.腾讯等大厂之中,最看中面试者刷题技能的大概要数有"链表厂"之称的字节跳动了.作为一个新晋大厂,字节跳动以高薪.技术大佬云集吸 ...

  2. eclipse 常见问题之字体更改、添加注释模板

    有些同学可能会和我有一样的困扰,每次想要更改字体大小.背景颜色等,都需要百度一下才知道怎么去做...不知道有没有这种情况的孩子,反正我经常遇到,老是记不住,今天写下来,顺带自己忘记的时候可以查看一下. ...

  3. tp5 常见问题 模板文件 路由

    W:视图 Q:是MVC中的V,也就是在模块下面的view目录下的html文件,就是写的页面. W:模板 Q:视图在控制器的叫法,在fetch,display等方法中传入的模板参数   最后传到视图. ...

  4. c++模板使用及常见问题

    一.为什么使用模板?? 使用模板的目的是为了避免重复声明和定义一系列基本功能相同的函数或者类,其区别因传入参数的不同而产生不同类型的数据,其基本工作过程都是一致的! 二.调用模板函数产生不明确问题 ( ...

  5. C++面试常见问题——17类模板的使用

    类模板的使用 注意在每次类模板函数时都需要声明一个类模板 #include<iostream> using namespace std; template <class T,int ...

  6. C++面试常见问题——16函数模板的使用

    函数模板的使用 函数模板在使用之前必须在外部对函数模板进行初始化. 函数模板的实例化包含两中 1.隐式实例化: template <class T> //没有: T Fun(T a,T b ...

  7. 翻译:常见问题——ABAP Development Tools for Eclipse

    ABAP Development Tools for Eclipse(简称ADT)是一个基于Eclipse的全新ABAP IDE,这篇文档试图回答有关ADT的最重要的常见问题.这只是一个开始,如果你对 ...

  8. h5移动端常见问题

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 1 <meta name="viewport" content="width=device-w ...

  9. OC基础--Xcode 模板修改和文档安装

    修改项目模板 项目模板就是创建工程的时候选择的某一个条目, Xcode会根据选择的条目生成固定格式的项目 如何修改项目模板 找到Xcode, 右键"显示包内容" 打开"/ ...

随机推荐

  1. 登录Linux服务器显示IP和自定义备注

    默认搭建好的Linux服务器,使用Xshell登录的窗口如下所示: 可根据需要执行如上代码,再重新登录服务器,效果如下图所示: 代码片段:echo "export PS1='\u@\[\e[ ...

  2. $NOIp2018$劝退记

    鸽子博主好久没更博了,这一更可能以后都更不了了啊 \(Day~~1\) 考试爆零,已经无所畏惧了. 当作攒rp吧...qwq 晚上写了写数学总结,蒯了一堆人的博客资料,然后就学会了\(CRT\),\( ...

  3. JSON数组形式字符串转换为List<Map<String,String>>的几种方法

    package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...

  4. 【BZOJ4543】Hotel加强版(长链剖分)

    [BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...

  5. luogu4602 混合果汁 (主席树)

    按照美味值从大到小排序,对于每个询问,我想二分找到一个前缀来满足条件 那么以单价为下标建主席树,维护区间的最大体积和 以及满足这个最大体积需要的价钱 然后二分答案,再在主席树上二分,找到恰好满足的那个 ...

  6. 牛客小白月赛12J(序列自动机)

    题目链接:https://ac.nowcoder.com/acm/contest/392/J 题目大意:给一个字符串s,然后在给出n个其他的字符串,判断每个字符串是否为s的子序列. 例: 输入: no ...

  7. PyCharm创建自定义代码段(JetBrains系列通用)

    创建自定义代码段或者修改代码段:(用习惯了VSCode的main格式,固而改下)

  8. AITP

    AITP AITP比较简单,适合刚毕业,即将开始IT生涯的学生.接受CIPS认证课程的毕业生可以自动获得AITP证书,并获得一年的免费的CIPS会员资格. 接受非CIPS认证课程的毕业生需要申请,另外 ...

  9. 百度地图API:自定义控件

    HTML: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...

  10. python enumarate方法的使用

    '''enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中.'''