种模板出错,请大侠看看

类模板出错,请大侠看看环境:WIN Xp + VS2010说明:模板类Queue部分函数尚未定义好Queue.h#ifndef QUEUE_H#d

类模板出错,请大侠看看
环境:WIN Xp + VS2010
说明:模板类Queue部分函数尚未定义好
Queue.h


#ifndef QUEUE_H
#define QUEUE_H
#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&, const Queue<Type>&);
QueueItem(const Type &t): item(t), next(0) {}
Type item;
QueueItem *next;
};

template <class Type> class Queue
{
friend std::ostream& 
    operator<< <Type> (std::ostream&, const Queue<Type>&);
public:
Queue(): head(0), tail(0) {}
public:
template <class It> 
    Queue(It beg, It end): 
          head(0), tail(0) { copy_elems(beg, end); }
Queue(const Queue &Q): head(0), tail(0)
{ copy_elems(Q); }
Queue& operator=(const Queue&);
~Queue() { destroy(); }
template <class Iter> void assign(Iter, Iter);
Type& front() { return head->item; }
const Type& front() const { return head->item; }
void push (const Type &);
void pop();
bool empty() const { return head == 0; }
private:
QueueItem<Type> *head;
QueueItem<Type> *tail;
void destroy();
void copy_elems(const Queue&);
private:
template <class Iter> void copy_elems(Iter, Iter);
};
#include "Queue.cpp"
#endif


Queue.cpp


#include "Queue.h"
template <class Type> void Queue<Type>::pop()
{
QueueItem<Type>* p = head;
head = head->next;
delete p;
}

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

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>::copy_elems(const Queue &orig)
{
for (QueueItem<Type> *pt = orig.head; pt; pt = pt->next)
push(pt->item);
}


main.cpp

#include "Queue.h"
#include <iostream>
using namespace std;

int main()
{
Queue<int> iQ;
int val;
cin >> val;
while (cin >> val)
iQ.push(val);
return 0;
}



出错信息:
1>------ 已启动生成: 项目: work, 配置: Debug Win32 ------


1>生成启动时间为 2013-1-8 20:02:30。
1>InitializeBuildStatus:
1>  正在对“Debug\work.unsuccessfulbuild”执行 Touch 任务。
1>ClCompile:
1>  Queue.cpp
1>d:\projects\work\queue\queue.cpp(8): error C2995: “void Queue<T>::pop(void)”: 函数模板已经定义
1>          d:\projects\work\queue\queue.h(36) : 参见“Queue<T>::pop”的声明
1>d:\projects\work\queue\queue.cpp(14): error C2995: “void Queue<T>::destroy(void)”: 函数模板已经定义
1>          d:\projects\work\queue\queue.h(41) : 参见“Queue<T>::destroy”的声明
1>d:\projects\work\queue\queue.cpp(25): error C2995: “void Queue<T>::push(const Type &)”: 函数模板已经定义
1>          d:\projects\work\queue\queue.h(35) : 参见“Queue<T>::push”的声明
1>d:\projects\work\queue\queue.cpp(31): error C2995: “void Queue<T>::copy_elems(const Queue<T> &)”: 函数模板已经定义
1>          d:\projects\work\queue\queue.h(42) : 参见“Queue<T>::copy_elems”的声明
1>
1>生成失败。
1>
1>已用时间 00:00:01.03
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
[解决办法]


//才调试一下,这样写
#ifndef QUEUE_CPP
#define QUEUE_CPP
template <class Type> 
void Queue<Type>::pop()
{
QueueItem<Type>* p = head;
head = head->next;
delete p;
}

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

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>::copy_elems(const Queue &orig)
{
for (QueueItem<Type> *pt = orig.head; pt; pt = pt->next)
push(pt->item);
}
#endif