недопустимое использование нестатического c члена данных 'lasd :: BinaryTreeVe c<int> :: treeVec' - PullRequest
0 голосов
/ 05 мая 2020

Я реализую двоичное дерево, используя вектор, который я ранее определил. В двоичном дереве есть структура Node внутри, и это похоже на невозможность получить доступ к вектору, определенному внутри класса двоичного дерева, из моих функций узла.

Итак, это двоичное дерево:

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 (), где я получаю ошибку: недопустимое использование нестатического c элемента данных ' lasd :: BinaryTreeVe c :: treeVec '. Мой профессор предлагает мне, что использование ссылки было бы лучшим вариантом для решения проблемы, поэтому я попытался объявить ссылку на treeVe c, чтобы я мог использовать ее внутри NodeVe c, но это было полностью бесполезно.

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; 
}

Я получаю ошибку компилятора каждый раз, когда использую treeVe c в функции HasLeftChild () здесь.

1 Ответ

0 голосов
/ 05 мая 2020

Вот как добавить ссылку treeVe c на ваш класс узла

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

Я создал новый конструктор для привязки ссылки. Я предполагаю, что у вас еще нет конструктора, но если вы это сделаете, вам придется вместо этого добавить приведенный выше код в существующий конструктор.

И, конечно же, вам нужно будет изменить существующий код где бы вы ни передали узел в новом параметре treeve c.

...