查找二叉树 (一)

记录分文件写模板类遇到的错误

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,但是为什么呢??? (知道的小哥哥小姐姐一定要在评论区告诉我)

猜你喜欢

转载自blog.csdn.net/a119258/article/details/80855986