我正在使用我先前定义的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参数,都将需要更改现有代码。