Code:
#include <iostream.h>

template <class T>
class Queue
{
private:
	// Local Element Class
	template <class T>
	struct Element
	{
		T m_info;
		Element<T> *m_next;
		//Default Constructor
		Element<T>(T elemInfo, Queue<T>::Element<T> * next=NULL)
		{
			m_info=elemInfo;
			m_next=next;
		}
	};

	// Header of Linked List
	Element<T> *m_head;

public:
	// Default Constructor
	Queue(){ m_head=NULL; }
	// Destructor                              
	~Queue();
	
	// Insertion functions
	void Enqueue(T&);
	T&   Dequeue();
	T&   Top();
	bool isEmpty() { return m_head==NULL;}
};


//Destructor
template <class T>
Queue<T>::~Queue()
{
	Queue<T>::Element<T> *temp;
	// While there is still an Element at the head of the Queue
	while (m_head!=NULL)
	{
		// Keep pointer to Element
		temp=m_head;
		// Move to next Element
		m_head=m_head->m_next;
		// Free Element's memory
		delete temp;
	}
}

// Insert new Element to the Queue
template <class T>
void Queue<T>::Enqueue(T &toAdd)
{
	// Create new Element, with m_head as it's next
	Queue<T>::Element<T>* temp=new Queue<T>::Element<T>(toAdd, m_head);
	// Set Queue head to new Element
	m_head=temp;
}

// Remove Element from Queue
template <class T>
T& Queue<T>::Dequeue()
{
	Queue<T>::Element<T>* temp;
	Queue<T>::Element<T>* temp2;
	T* returnValue;
	temp=temp2=m_head;
	
	// If Stack is not empty
	if (temp!=NULL)
	{
		// While temp is not last Element
		temp=temp->m_next;
		while (temp!=NULL && temp->m_next!=NULL)
		{
			// Move to next Element
			temp=temp->m_next;
			temp2=temp2->m_next;
		}
		temp2->m_next=NULL;
		// Return Element
		if (temp!=NULL)
		{
			returnValue=new T(temp->m_info);
			delete temp;
			return *returnValue;
		}
		else
		{
			returnValue=new T(m_head->m_info);
			delete m_head;
			m_head=NULL;
			return *returnValue;
		}
	}
	else
		throw "Queue is empty!";
}

// Get first Element in Queue
template <class T>
T& Queue<T>::Top()
{
	Queue<T>::Element<T>* temp;
	Queue<T>::Element<T>* temp2;
	temp=temp2=m_head
	
	// If Stack is not empty
	if (temp!=NULL)
	{
		// While temp is not last Element
		temp=temp->m_next;
		while (temp!=NULL)
		{
			// Move to next Element
			temp=temp->m_next;
			temp2=temp2->m_next;
		}
		// Return Element
		return temp->m_info;
	}
	else
		throw "Queue is empty!";
}





class point
{
public:
	int x,y;
	// Default constractor
	point (int n1=0, int n2=0):x(n1),y(n2){};
	// Default copy constractor
	point (point &p2):x(p2.x),y(p2.y){};

	// Assignment operator
	point& operator=(point &p2){ x=p2.x;y=p2.y; return *this;};
	
	// operator !=
	bool operator!=(point &p2)
	{
		if (p2.x==x && p2.y==y)
			return false;
		return true;
	}
	// operator ==
	bool operator==(point &p2)
	{
		if (p2.x==x && p2.y==y)
			return true;
		return false;
	}
	// Basic display function
	void print() { cout<<"( "<<x<<" , "<<y<<" )"<<endl; }
};



void main()
{
	Queue<point> QU;
	point a(1,2), b(3,4), c(5,6), d(10,10), e(0,0), f(8,4);
	point t;
	
	cout<<"Adding items to the Queue..."<<endl;
	QU.Enqueue(a);
	QU.Enqueue(b);
	QU.Enqueue(c);
	QU.Enqueue(d);
	QU.Enqueue(e);
	QU.Enqueue(f);

	cout<<"Printing Queue..."<<endl;
	while (!QU.isEmpty())
	{
		t=QU.Dequeue();
		t.print();
	}
	
}
I can't run it.What error?How to fix it,profs?