我正在使用我先前定义的Vector实现二叉树。 Binary Tree内部有一个结构节点,这就像不可能从Node函数访问Binary Tree类中定义的Vector一样。

这就是二叉树:

template <typename Data>
class BinaryTreeVec : public BinaryTree<Data>{
private:

protected:
    using BinaryTree<Data>::size;
    ulong height = 0;

public:
    using typename BinaryTree<Data>::Node;

    struct NodeVec : public Node{
    private:

    protected:
        using Node::value;
        ulong left;
        ulong right;
        ulong index;
        ulong height;
        bool isValid = false;

    public:
        friend class BinaryTreeVec<Data>;

        ....


        bool HasLeftChild() const noexcept override; // Override Node member
        bool HasRightChild() const noexcept override; // Override Node member

        ....
    }

    ....

protected:
    Vector<struct NodeVec> treeVec;
}

一切正常,直到我在调用HasLeftChild()函数为止
错误:无效使用了非静态数据成员“lasd::BinaryTreeVec::treeVec”。
我的教授建议我,使用引用将是解决问题的最佳选择,因此尝试声明对 treeVec 的引用,以便可以在NodeVec中使用它,但这是完全没有用的。
template <typename Data>
bool BinaryTreeVec<Data>::NodeVec::HasLeftChild() const noexcept{
    if( 2 * index + 1 < treeVec.Size())
        return ( treeVec[2 * index + 1].flag == true );

    return false;
}

每次我在此处的HasLeftChild()函数中使用 treeVec 时,都会遇到编译器错误。

最佳答案

这是向您的节点类添加treeVec引用的方法

struct NodeVec : public Node {
protected:
    ...
    Vector<NodeVec>& treeVec;
public:
    NodeVec(Vector<NodeVec>& tv) : treeVec(tv) {}
    ...
};

我创建了一个新的构造函数来绑定(bind)引用。我假设您还没有构造函数,但是如果这样做,则必须将上述代码添加到现有的构造函数中。

当然,无论您在哪里使Node传入新的treevec参数,都将需要更改现有代码。

10-07 16:29