zoukankan      html  css  js  c++  java
  • C++模板的使用以及常见问题

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

    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>,其他和普通成员函数的定义完全一样,尤其在类外定义时不要出错。
  • 相关阅读:
    解决跨域问题的后端解决方案
    java-反射
    验证接口实现类对于接口中所有方法是否都要重写?
    完成Triangle时遇到的问题
    刚知道的一种算法
    完成ATM编程练习题时遇到的问题
    完成Account编程练习遇到的问题
    完成StopWatch编程练习题时遇到的一些问题
    Window环境下Java备份和恢复Mysql数据
    IDEA导入项目不下载依赖问题
  • 原文地址:https://www.cnblogs.com/jiading/p/9838024.html
Copyright © 2011-2022 走看看