记录分文件写模板类遇到的错误
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,但是为什么呢??? (知道的小哥哥小姐姐一定要在评论区告诉我)