无效使用非静态数据成员'lasd::BinaryTreeVec<int>::treeVec'。

问题描述 投票:0回答:1

我在用我之前定义的一个Vector实现一个Binary Tree,这个Binary Tree里面有一个结构Node,好像无法从我的Node函数中获取Binary Tree类里面定义的Vector的访问权限。二进制树里面有一个结构体Node,好像无法从我的Node函数中获得对二进制树类里面定义的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; 
}

每次我使用 treeVec 在这里的HasLeftChild()函数中。

c++ compiler-errors static
1个回答
0
投票

下面是如何在你的节点类中添加一个treeVec的引用

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

我已经创建了一个新的构造函数来绑定引用。我假设你还没有一个构造函数,但如果你有,那么你就必须把上面的代码添加到你现有的构造函数中。

当然,你也需要修改你现有的代码,在你做Node的任何地方传递新的treevec参数。

© www.soinside.com 2019 - 2024. All rights reserved.