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.

2
  • 1
    Whoever wrote that tutorial needs to read a few more tutorials. This question hints at how dated that code is. Commented Apr 16, 2015 at 14:13
  • 2
    You need a declaration of LinkedQueue before the Node class. And change iostream.h to iostream. Commented Apr 16, 2015 at 14:14

1 Answer 1

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 ... }; 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.