C++ 模板编程编译错误
请教高手
我在学习C++的模板,练习一个例子程序时编译总报错如下错误,不知是什么回事:
1>Queue.cpp
1>d:\dev\mytest\opclass\queue.cpp(10) : error C2995: “void Queue<Type>::destroy(void)”: 函数模板已经定义
1> d:\dev\mytest\include\queue.h(57) : 参见“Queue<Type>::destroy”的声明
1>d:\dev\mytest\opclass\queue.cpp(18) : error C2995: “void Queue<Type>::pop(void)”: 函数模板已经定义
1> d:\dev\mytest\include\queue.h(44) : 参见“Queue<Type>::pop”的声明
1>d:\dev\mytest\opclass\queue.cpp(34) : error C2995: “void Queue<Type>::push(const Type &)”: 函数模板已经定义
1> d:\dev\mytest\include\queue.h(43) : 参见“Queue<Type>::push”的声明
1>d:\dev\mytest\opclass\queue.cpp(44) : error C2995: “void Queue<Type>::copy_item(const Queue<Type> &)”: 函数模板已经定义
1> d:\dev\mytest\include\queue.h(56) : 参见“Queue<Type>::copy_item”的声明
1>d:\dev\mytest\opclass\queue.cpp(60) : error C2995: “void Queue<Type>::print(void)”: 函数模板已经定义
1> d:\dev\mytest\include\queue.h(50) : 参见“Queue<Type>::print”的声明
Queue.h文件:
#ifndef _QUEUE_H_
#define _QUEUE_H_
template <typename Type> class Queue;
template <typename Type>
class QueueItem
{
friend class Queue<Type>;
QueueItem( const Type& t ):value(t),next(0) {}
Type value;
QueueItem* next;
};
template <typename Type>
class Queue
{
public:
Queue():head(0),tail(0) {}
Queue( const Queue& Q ):head(0),tail(0)
{
copy_item(Q);
}
~Queue()
{
destroy();
}
Type& front()
{
return head->value;
}
const Type& front() const
{
return head->value;
}
void push( const Type& );
void pop();
bool empty() const
{
return head == 0;
}
void print();
protected:
private:
QueueItem<Type>* head;
QueueItem<Type>* tail;
void copy_item( const Queue& );
void destroy();
};
#include "Queue.cpp"
#endif
Queue.cpp文件:
#include "Queue.h"
template <typename Type>
void Queue<Type>::destroy()
{
while ( !empty() )
{
pop();
}
}
template <typename Type>
void Queue<Type>::pop()
{
QueueItem<Type> *ptr = head;
head = head->next;
delete ptr;
}
template <typename Type>
void Queue<Type>::push( const Type& t )
{
QueueItem<Type> *ptr = new QueueItem(t);
if ( empty() )
{
head = tail = ptr;
}
else
{
tail->next = ptr;
tail = tail->next;
}
}
template <typename Type>
void Queue<Type>::copy_item( const Queue& Q )
{
QueueItem<Type> *ptr = Q.head;
for ( ; ptr ; ptr++ )
{
push( ptr->value );
}
}
template <typename Type>
void Queue<Type>::print()
{
while( !empty() )
{
cout << head->value << endl;
}
}