#include "stdafx.h"<br />#include <iostream><br />using namespace std;<br />// 錯誤的例子<br />//template <class T> class ListItem;<br />//template <class T> class List {<br />//public:<br />//List<T> ();<br />//List<T> ( const List<T>& );<br />//List<T>& operator = (const List<T>&);<br />//<br />//~List();<br />//<br />//void insert(ListItem* ptr, T value_);<br />//ListItem *find(T value_);<br />//<br />//private:<br />//ListItem *front;<br />//ListItem *end;<br />//};<br />template <class Type><br />class QueueItem {<br />public:<br />QueueItem(const Type &t) : item(t), next(0) {}<br />Type item;<br />QueueItem *next;<br />};<br />template <class Type><br />class Queue {<br />public:<br />Queue() : head(0),tail(0) {}<br />Queue(const Queue &Q):head(0), tail(0) {<br />copy_elems(Q);<br />}<br />template <class Type2> // 這裡重新聲明的目的是為了支援類型轉換<br />Queue<Type>& operator=(const Queue<Type2>&);<br />~Queue() { destroy(); }<br />Type& front() { return head->item; }<br />const Type &front() const { return head->item; }<br />void push( const Type& );<br />void pop();<br />bool empty() const {<br />return head == 0;<br />}<br />private:<br />QueueItem<Type> *head;<br />QueueItem<Type> *tail;<br />void destroy();<br />void copy_elems(const Queue&);<br />};<br />template <class Type><br />void Queue<Type>::push( const Type& val)<br />{<br />QueueItem<Type> *pt = new QueueItem<Type>(val);<br />if(empty())<br />head = tail = pt;<br />else {<br />tail->next = pt;<br />tail = pt;<br />}<br />}<br />template <class Type><br />void Queue<Type>::pop()<br />{<br />QueueItem<Type>* p = head;<br />head = head->next;<br />delete p;<br />}<br />template <class Type><br />void Queue<Type>::destroy()<br />{<br />while(!empty())<br />pop();<br />}<br />template <class Type><br />void Queue<Type>::copy_elems(const Queue& orig)<br />{<br />for(QueueItem<Type>* pt = orig.head;pt;pt = pt->next)<br />push(pt->item);<br />}<br />template <class Type><br />template <class Type2> // 這裡重新聲明的目的是為了支援類型轉換<br />Queue<Type>& Queue<Type>::operator=( const Queue<Type2>& orig)<br />{<br />if((void*)this == (void*)&orig) {<br />*this;<br />}<br />Queue<Type2> tmp(orig);<br />destroy(); // delete</p><p>while(!tmp.empty())<br />{<br />push(tmp.front());<br />tmp.pop();<br />}<br />return *this;<br />}<br />int main()<br />{<br />Queue<int> qi;<br />short s = 43;<br />int i = 23;<br />qi.push(s);<br />qi.push(i);<br />Queue<float> ai;<br />ai = qi;<br />Queue<int> bi;<br />return 0;<br />}