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为相同类型
    注意声明类模板和声明友元的不同,我开始就被这个给坑了

  • 相关阅读:
    Hyper-V无法启动虚拟机因为虚拟机监控程序未运行
    SpringBoot项目中自动加载datasourceConfig配置导致启动失败
    redis 数据类型与命令
    Redis入门与安装,与配置
    MySQL 主从配置
    MySql 中的事务
    什么是Docker?
    window10下安装Docker
    Docker 常见命令
    原生SQL语句
  • 原文地址:https://www.cnblogs.com/kwebi/p/9788552.html
Copyright © 2011-2022 走看看