2015-04-16 89 views
0

我对C++非常陌生。我正在通过here的以下示例进行工作。我得到expected a declaration错误行friend LinkedQueue<T>;。我的理解是我需要使用像friend TYPE LinkedQueue<T>;这样的陈述。该网站上的代码是否发布错误?朋友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; 
} 

由于执行队列中。

+1

无论谁写了这篇教程需要阅读更多的教程。 [这个问题](http://stackoverflow.com/questions/2976477)提示该代码的日期。 –

+2

您需要在'Node'类之前声明'LinkedQueue'。并将'iostream.h'改为'iostream'。 – 0x499602D2

回答

3

你必须class Node在什么地方申报class LinkedQueue。 使用像这样的前向声明:

template<class T> 
class LinkedQueue; // forward declaration 

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

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