C++
當友元是類模板時如今有這樣一個類模板this
//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 };
存在另外一個類模板,須要訪問上面的類模板的私有域code
//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類爲友元
但兩個類不在同一文件中element
因此必須先聲明Queue類模板;rem
//QueueItem.hpp template <class T> class Queue;
同時也必須聲明Queue類爲友元it
template <class T> class QueueItem { friend class Queue<T>; //...同上 };
這裏Queue
注意聲明類模板和聲明友元的不一樣,我開始就被這個給坑了