查詢二叉樹 (一)
阿新 • • 發佈:2019-01-31
記錄分檔案寫模板類遇到的錯誤
1.將節點結構體的定義放在private中遇到的錯誤,錯誤程式碼如下:
binarySearchTree.h
#ifndef BINARYSEARCHTREE_H
#define BINARYSEARCHTREE_H
template<typename Comparable>
class BinarySearchTree
{
public:
BinarySearchTree();
BinarySearchTree(const BinarySearchTree& rhs);
~BinarySearchTree();
const Comparable& findMin() const;
const Comparable& findMax() const;
bool contains(const Comparable& x) const;
bool isEmpty() const;
void printTree() const;
void makeEmpty();
void insert(const Comparable& x);
void remove(const Comparable& x);
const BinarySearchTree& operator =(const BinarySearchTree& rhs);
private:
void insert(const Comparable &x, BinaryNode*& t) const;
void remove(const Comparable &x, BinaryNode*& t) const;
BinaryNode* findMin(BinaryNode* t) const;
BinaryNode* findMax(BinaryNode* t) const;
bool contains(const Comparable &x, BinaryNode* t) const ;
void makeEmpty(BinaryNode*& t);
void printTree(BinaryNode* t) const;
BinaryNode* clone(BinaryNode *t) const;
private:
struct BinaryNode
{
Comparable element;
BinaryNode* left;
BinaryNode* right;
BinaryNode(const Comparable& theElement, BinaryNode* lt, BinaryNode* rt) :
element(theElement), left(lt), right(rt){}
};
BinaryNode* root;
};
#endif // BINARYSEARCHTREE_H
報錯
error: ‘BinaryNode’ has not been declared
void insert(const Comparable &x, BinaryNode*& t) const;
錯誤原因,是我們新定義了BinaryNode結構體,但是使用它是在定義它的前面,等於未定義就使用,所以會報錯.
解決方法,將兩個private部分調換一下位置,程式碼如下:
private:
struct BinaryNode
{
Comparable element;
BinaryNode* left;
BinaryNode* right;
BinaryNode(const Comparable& theElement, BinaryNode* lt, BinaryNode* rt) :
element(theElement), left(lt), right(rt){}
};
BinaryNode* root;
private:
void insert(const Comparable &x, BinaryNode*& t) const;
void remove(const Comparable &x, BinaryNode*& t) const;
BinaryNode* findMin(BinaryNode* t) const;
BinaryNode* findMax(BinaryNode* t) const;
bool contains(const Comparable &x, BinaryNode* t) const;
void makeEmpty(BinaryNode*& t);
void printTree(BinaryNode* t) const;
BinaryNode* clone(BinaryNode *t) const;
2.模板類分檔案實現,在cpp中實現遇到的錯誤
下面是部分程式碼
binarySearchTree.cpp
template<typename Comparable>
const BinarySearchTree<Comparable> &BinarySearchTree<Comparable>::operator=(const BinarySearchTree &rhs)
{
}
template<typename Comparable>
void BinarySearchTree<Comparable>::insert(const Comparable &x, BinarySearchTree<Comparable>::BinaryNode *&t) const
{
}
template<typename Comparable>
void BinarySearchTree<Comparable>::remove(const Comparable &x, BinarySearchTree<Comparable>::BinaryNode *&t) const
{
}
template<typename Comparable>
BinarySearchTree<Comparable>::BinaryNode *BinarySearchTree<Comparable>::findMax(BinarySearchTree<Comparable>::BinaryNode *t) const
{
}
如上程式碼中findMax函式的實現是錯誤的(等一下再說)
據說不同編譯器對模板類的分檔案實現的方法是不同的,為什麼是據說呢?因為我自己沒有遇到,但是好多書中是這麼說的(我用vs2015,和MinGW編譯器都使過可行).下面是實現方法
- 在.h檔案中,類的定義上面加template <typename Comparable>,這裡typename和class等效
- 首先在cpp中要include模板類的標頭檔案 #include “binarySearchTree.h”
- 在每個要實現的函式上面(前面)要加 template <typename Comparable>
- 所有需要類空間名字的地方都用 “BinarySearchTree<Comparable>::” 代替 “BinarySearchTree::”
大家都看到了,我的findMax是按照上面的方法實現的,但是還是報錯,為什麼呢?
先看一下報的錯
error: need ‘typename’ before ‘BinarySearchTree<Comparable>::BinaryNode’ because ‘BinarySearchTree<Comparable<’ is a dependent scope
很明顯需要在前面加typename,但是為什麼呢??? (知道的小哥哥小姐姐一定要在評論區告訴我)