最近的數據結構實驗頻繁地遇到了模板,之前對這一塊接觸不多,遇到了很多問題,放到這里總結一下。
- 模板的聲明有兩種:template <typename Type>或者template<class Type>。雖然建議使用typename以避免二義性,但是這兩種實際上是都可以的
- 模板只作用於其下方的一個類或者函數,所以在類外實現成員函數時要對每一個函數都在之前進行模板的聲明(即使如果這個函數沒有用到這個模板類型,但是類名里也要加上<Type>)
- 與普通函數和類不同,模板函數或類在其他類作為友元之前必須先進行聲明(不用定義,聲明即可),否則無法通過編譯,例如:
template<typename T>class BinaryTree; template<typename T> class BinaryTreeNode {//define the node of binary tree friend class BinaryTree<T>; //friend class BinarySearchTree<T>;
如果不加入第一行,則無法通過編譯。
- 在同一個類或者函數中可以使用多個模板,放在一條語句中聲明即可:template<typename T1,T2>。
- 模板類和函數在實例化時。注意不能使用new語句,而應采用 類名<具體類型名>具體類或者函數的名稱。這一點在初學時很容易犯。
- 在同一個文件的不同類中可以使用多個模板,例如對class a,我們使用了模板T1,對於class B,我們可以使用模板T2,完全沒有問題。不僅如此,在實例化時,可以把一個類的模板類型實例化為另一個模板類或者與其有關的類型。例如,定義鏈隊列類時:
template <typename Type> class LinkQueueNode {
定義二叉樹類時:
template<typename T> class BinaryTree {
而在二叉樹的一個成員函數中,我們可以使用:
void BinaryTree<T>::LevelOrder(BinaryTreeNode<T>*root) { /*二叉樹的層序遍歷*/ LinkQueue<BinaryTreeNode<T>*>tQueue;//鏈隊列,節點類型為二叉樹節點指針類型
注意這里把鏈隊列的類型實例化為了二叉樹節點類指針的類型!這樣,在最后將二叉樹類型實例化時,使用鏈隊列對象就完全沒有問題。
- 對於使用了模板的類要注意,定義成員函數時,類型名之后都要加<T>,其他和普通成員函數的定義完全一樣,尤其在類外定義時不要出錯。