我在用我之前定义的一个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()函数中。
下面是如何在你的节点类中添加一个treeVec的引用
struct NodeVec : public Node {
protected:
...
Vector<NodeVec>& treeVec;
public:
NodeVec(Vector<NodeVec>& tv) : treeVec(tv) {}
...
};
我已经创建了一个新的构造函数来绑定引用。我假设你还没有一个构造函数,但如果你有,那么你就必须把上面的代码添加到你现有的构造函数中。
当然,你也需要修改你现有的代码,在你做Node的任何地方传递新的treevec参数。