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>,其他和普通成员函数的定义完全一样,尤其在类外定义时不要出错。
posted @ 2018-10-23 17:40  别再闹了  阅读(1964)  评论(0编辑  收藏  举报