C++Primer第四版 第十六章的例子关于Queue模版例子的编译有关问题

C++Primer第四版 第十六章的例子关于Queue模版例子的编译问题
QueueItem.h

#pragma once
#include <iostream>
template <class Type> class Queue_;

template <class T> 
std::ostream& operator<<(std::ostream&, const Queue_<T>&);

template <class Type>
class QueueItem
{
friend class Queue_<Type>;
friend std::ostream& operator<< <Type>(std::ostream &os, const Queue_<Type> &q); //<Type>要加,不然编译出错
public:
QueueItem();
// ~QueueItem();
private:
QueueItem(const Type &t):next(0),item(t){}
Type item;
QueueItem *next;
};

QueueItem.cpp

#include "StdAfx.h"
#include "QueueItem.h"


template <class Type> QueueItem<Type>::QueueItem()
{
}


//template <class type> QueueItem<type>::~QueueItem()
//{
//}

Queue_.h

#pragma once
#include <iostream>
#include "QueueItem.h"

template <class Type>
class Queue_
{
friend std::ostream& operator<< <Type>(std::ostream &os, const Queue_<Type> &q);//<Type>要加,不然编译出错
public:
Queue_(void):head(0),tail(0){}
~Queue_(void){ destroy(); }
Queue_(const Queue_ &q):head(0),tail(0) { copy_elem(q); }
Queue_& operator=(const Queue_ &q);
bool empty() const{ return head == 0; }
void push(const Type &val);
void pop();
Type& front(){ return head->item; }
private:
QueueItem<Type> *head,*tail;
void destroy();
void copy_elem(const Queue_ &q);
};
#include "Queue_.cpp"

Queue_.cpp

#include "StdAfx.h"
#include "Queue_.h"

template <class Type> Queue_<Type>& Queue_<Type>::operator=(const Queue_ &rhs)
{
if (this != &rhs)
{
destroy();
copy_elem(rhs);
}
return *this;
}

template <class Type> void Queue_<Type>::destroy()
{
while(!empty())
{
pop();
}
}

template <class Type> void Queue_<Type>::copy_elem(const Queue_ &orig)
{
QueueItem<Type> *pt;
for (pt = orig.head; pt; pt = pt->next)
{
push(pt->item);
}
}

template <class Type> void Queue_<Type>::push(const Type &val)
{
QueueItem<Type> *pt = new QueueItem<Type>(val);
if (empty())
{
head = tail = pt;
}
else
{
tail->next = pt;
tail = pt;
}

}

template <class Type> void Queue_<Type>::pop()
{
if (!empty())
{
QueueItem<Type> *pt = head;
head = head->next;
delete pt;
}
}

template <class T>
std::ostream& operator<<(std::ostream &os, const Queue_<T> &q)
{