友元 LinkedQueue<T>;期望有声明

friend LinkedQueue<T>; expected a declaration

本文关键字:期望 声明 gt lt 友元 LinkedQueue      更新时间:2023-10-16

我对C++很陌生。我正在通过下面的例子从这里开始工作。我在第 friend LinkedQueue<T>; 行中收到expected a declaration错误。我的理解是我需要使用像friend TYPE LinkedQueue<T>;这样的语句。网站上发布的代码有误吗?

C++使用链接表示实现队列的程序

#include <iostream.h>
template<class T>
class Node
{
    friend LinkedQueue<T>;
    private:
    T data;
    Node<T> *link;
};
template<class T>
class LinkedQueue {
    public:
        LinkedQueue() {front = rear = 0;} // constructor
        ~LinkedQueue(); // destructor
        int IsEmpty() const
        {return ((front) ? 0 : 1);}
        T First() const; // return first element
        T Last() const; // return last element
        LinkedQueue<T>& Add(const T& x);
        LinkedQueue<T>& Delete(T& x);
    private:
        Node<T> *front;  // pointer to first node
        Node<T> *rear;   // pointer to last node
};
    template<class T>
LinkedQueue<T>::~LinkedQueue()
{// Queue destructor.  Delete all nodes.
    Node<T> *next;
    while (front) {
        next = front->link;
        delete front;
        front = next;
    }
}
template<class T>
T LinkedQueue<T>::First() const
{
    if (IsEmpty())   { cout<<"OutOfBounds()";  return -1; };
    return front->data;
}
template<class T>
T LinkedQueue<T>::Last() const
{
    if (IsEmpty()) { cout<<"OutOfBounds()";    return -1; };
    return rear->data;
}
    template<class T>
LinkedQueue<T>& LinkedQueue<T>::Add(const T& x)
{
    Node<T> *p = new Node<T>;
    p->data = x;
    p->link = 0;
    if (front) rear->link = p;  // queue not empty
    else front = p;             // queue empty
    rear = p;
    return *this;
}
    template<class T>
LinkedQueue<T>& LinkedQueue<T>::Delete(T& x)
{
    if (IsEmpty()) {  cout<<"OutOfBounds()"; return *this; };
    x = front->data;
    Node<T> *p = front;
    front = front->link;
    delete p;
    return *this;
}
void main(void)
{
    LinkedQueue<int> Q;
    int x;
    Q.Add(1).Add(2).Add(3).Add(4);
    cout << "No queue add failed" << endl;
    cout << "Queue is now 1234" << endl;
    Q.Delete(x);
    cout << "Deleted " << x << endl;
    cout << Q.First() << " is at front" << endl;
    cout << Q.Last() << " is at end" << endl;
    Q.Delete(x);
    cout << "Deleted " << x << endl;
    Q.Delete(x);
    cout << "Deleted " << x << endl;
    Q.Delete(x);
    cout << "Deleted " << x << endl;
    cout << "No queue delete failed " << endl;
}

谢谢。

您必须在class Node之前在某个地方声明class LinkedQueue。使用像这样的前向声明:

template<class T>
class LinkedQueue; // forward declaration
template<class T>
class Node
{
    // definition ...    
};
template<class T>
class LinkedQueue {
    // definition ...
};