1. 程式人生 > >查詢二叉樹 (一)

查詢二叉樹 (一)

記錄分檔案寫模板類遇到的錯誤

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編譯器都使過可行).下面是實現方法

  1. 在.h檔案中,類的定義上面加template <typename Comparable>,這裡typename和class等效
  2. 首先在cpp中要include模板類的標頭檔案 #include “binarySearchTree.h”
  3. 在每個要實現的函式上面(前面)要加 template <typename Comparable>
  4. 所有需要類空間名字的地方都用 “BinarySearchTree<Comparable>::” 代替 “BinarySearchTree::”

大家都看到了,我的findMax是按照上面的方法實現的,但是還是報錯,為什麼呢?
先看一下報的錯
error: need ‘typename’ before ‘BinarySearchTree<Comparable>::BinaryNode’ because ‘BinarySearchTree<Comparable<’ is a dependent scope
很明顯需要在前面加typename,但是為什麼呢??? (知道的小哥哥小姐姐一定要在評論區告訴我)