0

I am very new to C++. I was working through following example from here. I am getting expected a declaration error in line friend LinkedQueue<T>;. My understanding is that I need to use a statement like friend TYPE LinkedQueue<T>;. Is the code posted on the website wrong?

C++ program to implement Queue using Linked Representation

#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;
}

Thanks.

Sudhir Singh Khanger
  • 1,598
  • 2
  • 17
  • 34
  • 1
    Whoever wrote that tutorial needs to read a few more tutorials. [This question](http://stackoverflow.com/questions/2976477) hints at how dated that code is. – Drew Dormann Apr 16 '15 at 14:13
  • 2
    You need a declaration of `LinkedQueue` before the `Node` class. And change `iostream.h` to `iostream`. – David G Apr 16 '15 at 14:14

1 Answers1

3

You have to declare class LinkedQueue somewhere before class Node. Use forward declaration like this:

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

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

template<class T>
class LinkedQueue {
    // definition ...
};
snnw
  • 98
  • 7
Chan Kha Vu
  • 9,834
  • 6
  • 32
  • 64