我正在类中编写所有方法原型,它们的定义将不在其范围内。这是我的AVL类设置:
template <class type>
class avlTree : public binarySearchTree<type>
{
public:
avlTree(); //default constructor
~avlTree(); //destructor
const type & findMin() const;
const type & findMax() const;
bool isEmpty() const;
void printTree() const;
void makeEmpty();
void insert(const type & newData);
void remove(const type & deleteItem);
private:
template<class type>
struct avlNode
{
type info;
avlNode *left;
avlNode *right;
int height;
avlNode(const type & data, avlNode *ll, avlNode *rl, int h = 0)
: info{ data }, left{ ll }, right{ rl }, height{ h } {}
};
avlNode<type> * root;
void insert(const type & newData, avlNode<type> * & p);
void remove(const type & deleteItem, avlNode<type> * & p);
avlNode<type>* findMin(avlNode<type> * p); //these two methods are where I'm having problems.
avlNode<type>* findMax(avlNode<type> * p);
};
我在编写内部(私有)findMin()
和findMax()
定义时遇到了麻烦。为了增加清晰度,不是实际算法,而是返回avlNode对象指针的语法。该类中的原型没有显示任何错误,但是当我尝试在该类之外编写其定义时,Intellisense将不会显示,并且当我尝试编码时,本地p指针也不会显示其成员p->member
。通常,Intellisense会显示下拉菜单及其成员,但不会显示。因此,我知道存在某种语法错误。我认为这可能与模板的设置方式有关,但我不确定。那我在做什么错?
我遇到的方法定义有问题:
template <class type>
typename avlTree<type>::avlNode* avlTree<type>::findMin(avlNode * p)
{
if (p == nullptr)
return nullptr;
if (p->left == nullptr) //when I hover over 'p->left' that's when Intellisense says '<unknown> avlTree<type>::avlNode::left'
return p;
return findMin(p->left); //same thing here
}
这应该做到这一点:
template <typename type>
avlTree<type>::avlNode<type>*
avlTree<type>::findMin(avlNode<type>* p) {
// ...
}
如果您还没有意识到这一点,则无需将avlNode
其自身作为模板。您正在启用不必要的灵活性,这avlTree<int>::avlNode<long>
是一回事,但实际上从未利用过这种灵活性。创建avlNode
一个普通的非模板成员类-这将大大简化事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句