模板类的定义与模板类成员函数的实现分别在(.h和.cpp)的过程出现的问题
//queue.h
#ifndef QUEUE_H
#define QUEUE_H
template<class Type>class Queue;
template<class Type> class QueueItem{
friend class Queue<Type>;
QueueItem(const Type &t):item(t),next(0){}
Type item;
QueueItem *next;
};
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
//queue.cpp
#include "stdafx.h"
template<class Type> void Queue<Type>::destroy()
{
while(!empty())
pop();
}
template <class Type> void Queue<Type>::pop()
{
QueueItem<Type> *p=head;
head=head->next;
delete p;
}
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!=0;pt=pt->next)
push(pt->item);
}
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &orig)
{
destroy();
copy_elems();
return *this;
}
------------------------------------------------------------------------------------------------
//queue.h
#ifndef QUEUE_H
#define QUEUE_H
template<class Type>class Queue;
template<class Type> class QueueItem{
friend class Queue<Type>;
QueueItem(const Type &t):item(t),next(0){}
Type item;
QueueItem *next;
};
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
//queue.cpp
#include "stdafx.h"
#include "queue.h"
template<class Type> void Queue<Type>::destroy()
{
while(!empty())
pop();
}
template <class Type> void Queue<Type>::pop()
{
QueueItem<Type> *p=head;
head=head->next;
delete p;
}
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!=0;pt=pt->next)
push(pt->item);
}
template <class Type> Queue<Type>& Queue<Type>::operator=(const Queue &orig)
{
destroy();
copy_elems();
return *this;
}
我的问题是为什么在cpp中include "queue.h"后可以运行正确;但是如果在头文件queue.h中include "queue.cpp"会出现很多错误呢?