种模板分别编译模型中头文件里 #include "cpp" 的位置

类模板分别编译模型中头文件里 #include "...cpp" 的位置
本帖最后由 aytfly 于 2013-07-15 16:13:38 编辑
类模板分别编译模型中头文件里 #include "...cpp" 的位置为什么一定要在头文件的尾部,在头部就
出现好多莫名奇妙的错误?另外,赋值操作符里那个if比较对吗?
代码如下(只看头文件一头一尾即可):
头文件:
#ifndef QUEUE_H
#define QUEUE_H
//#include "Queue.cpp"  // 放在这错误

template <class Type>
class QueueItem
{
QueueItem( const Type &t ) : item( t ), next( 0 ) { }
Type item;
QueueItem *next;
template <class Type> friend class Queue;
};

template <class Type>
class Queue
{
public:
Queue() : head( 0 ), tail( 0 ) { }
Queue( const Queue &Q ) : head( 0 ), tail( 0 )
{
copy_elems( Q );
}
Queue& operator = ( const Queue& ); //
~Queue()
{
destroy();
}
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& );
};

#include "Queue.cpp"  // 放在这正确
#endif

源文件:
#include "Queue.h"

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

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