【问题标题】:Having trouble returning a templated struct object pointer返回模板化结构对象指针时遇到问题
【发布时间】:2015-06-30 03:41:31
【问题描述】:

我正在编写类中的所有方法原型,它们的定义将在它之外。这是我的 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-&gt;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
}

【问题讨论】:

    标签: c++ templates pointers


    【解决方案1】:

    应该这样做:

    template <typename type>
    avlTree<type>::avlNode<type>* 
        avlTree<type>::findMin(avlNode<type>* p) {
      // ...
    }
    

    如果您还没有意识到,您不需要将avlNode 本身设为模板。您正在启用不必要的灵活性,avlTree&lt;int&gt;::avlNode&lt;long&gt; 是一件事,但从未真正利用过这种灵活性。使 avlNode 成为一个普通的非模板成员类 - 这将大大简化问题。

    【讨论】:

    • 啊,我明白了。因为 avlNode 结构是 avlTree 类的一部分,所以您必须键入 avlTree&lt;type&gt;::avlNode&lt;type&gt;*。我忘记了那部分。现在有道理了。谢谢。
    • 在返回类型之前需要typename,因为avlNode 是一个依赖类型。
    • @IgorTandetnik:我的评论是关于当avlNode 被固定为不再是“本身就是一个模板”,正如你所说的那样......见here。
    • @IgorTandetnik 我尝试按照您所说的方式不将avlNode 设为模板,现在当我尝试p-&gt;member 时,成员不会显示。此外,当我保持原样(使用avlNode 模板)时,它不会编译并说我需要在第一个* 之后使用分号
    • @IgorTandetnik 好的,我修复了它,因为我忘记了返回类型之前的typename。它可以编译,但现在p-&gt;member 仍然不会显示其下拉菜单,当我将鼠标悬停在它上面时,Intellisense 会显示&lt;unknown&gt; avlTree&lt;type&gt;::avlNode::left。为什么说&lt;unknown&gt;?我将发布定义,以便您了解我的意思。
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多