返回模板化结构对象指针时出现问题

Having trouble returning a templated struct object pointer

本文关键字:问题 指针 对象 结构 返回      更新时间:2023-10-16

我正在编写类中的所有方法原型,它们的定义将在它之外

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->member进行编码时,本地p指针也不会显示其成员。通常Intellsense会显示带有其成员的下拉菜单,但它没有显示。所以我知道存在某种语法错误。我想这可能与模板的设置方式有关,但我不确定。那么我做错了什么?

我的方法定义遇到问题:

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成为一个普通的非模板成员类,这将大大简化问题。