zoukankan      html  css  js  c++  java
  • C++ 当友元是类模板时

    C++ 当友元是类模板时

    现在有这样一个类模板

    //QueueItem.hpp
    template <class T>
    class QueueItem
    {
    private:
        QueueItem(const T &t) : item(t), next(0) {}
        T item;          // value stored in this element
        QueueItem *next; // pointer to next element in the Queue
    };
    

    存在另一个类模板,需要访问上面的类模板的私有域

    //Queue.hpp
    template <class T>
    class Queue
    {
      public:
        Queue() : head(0), tail(0) {} //名字 Queue 是 Queue<Type> 缩写表示
        Queue(const Queue &q) : head(0), tail(0) { copy_elems(q); }
        Queue &operator=(const Queue &); // copy control to manage pointers to QueueItems in the Queue
        virtual ~Queue() { destroy(); }
        Type &front() { return head->item; } // return element from head of Queue
        const Type &front() const { return head->item; }
        void push(const Type &); // add element to back of Queue
        void pop();              // remove element from head of Queue
        bool empty() const
        { // true if no elements in the Queue
            return head == 0;
        }
    
      private:
        QueueItem<Type> *head;          // pointer to first element
        QueueItem<Type> *tail;          // pointer to last element
        void destroy();                 // delete all the elements
        void copy_elems(const Queue &); // copy elements from parameter
    }
    

    要访问QueueItem类私有域就必须声明Queue类为友元
    但两个类不在同一文件中

    所以必须先声明Queue类模板;

    //QueueItem.hpp
    template <class T> class Queue;
    

    同时也必须声明Queue类为友元

    template <class T>
    class QueueItem
    {
        friend class Queue<T>;
        //...同上
    };
    

    这里Queue的T与QueueItem的T为相同类型
    注意声明类模板和声明友元的不同,我开始就被这个给坑了

  • 相关阅读:
    思考问题的方法
    专注于工作以及工作相关的技术
    优化的思想
    Web开发基础之问 20130505
    外企一线开发经理的核心竞争力
    你说的话算不算数?
    不抱怨的世界
    欲立庙堂,先立栋梁
    ASP.NET 高级程序设计学习笔记 20130505
    function在forn表单中方法报错的解决方法
  • 原文地址:https://www.cnblogs.com/kwebi/p/9788552.html
Copyright © 2011-2022 走看看