#include "stdafx.h" #include <iostream> using namespace std; // 错误的例子 //template <class T> class ListItem; //template <class T> class List { //public: // List<T> (); // List<T> ( const List<T>& ); // List<T>& operator = (const List<T>&); // // ~List(); // // void insert(ListItem* ptr, T value_); // ListItem *find(T value_); // //private: // ListItem *front; // ListItem *end; //}; template <class Type> class QueueItem { public: 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); } template <class Type2> // 这里重新声明的目的是为了支持类型转换 Queue<Type>& operator=(const Queue<Type2>&); ~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&); }; 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() { 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) push(pt->item); } template <class Type> template <class Type2> // 这里重新声明的目的是为了支持类型转换 Queue<Type>& Queue<Type>::operator=( const Queue<Type2>& orig) { if((void*)this == (void*)&orig) { *this; } Queue<Type2> tmp(orig); destroy(); // delete while(!tmp.empty()) { push(tmp.front()); tmp.pop(); } return *this; } int main() { Queue<int> qi; short s = 43; int i = 23; qi.push(s); qi.push(i); Queue<float> ai; ai = qi; Queue<int> bi; return 0; }