Не удается получить доступ к структуре, определенной в базовом классе

Я реализовал класс BinaryTree и внутри определения BinaryTree определил структуру «BinaryNode».

      #ifndef BINARYTREE_H
#define BINARYTREE_H
#include <iostream>
#define SPACE 10

template <class T,class U>
class BinaryTree
{
protected:

    typedef struct BinaryNode{
        U data;
        T key;
        struct BinaryNode* left;
        struct BinaryNode* right;
        struct BinaryNode* parent;
        BinaryNode(const T _key, const U& _data): key(_key), data(_data){}
        virtual ~BinaryNode(){
        if(left)
            delete left;
        if(right)
            delete right;
        }

    }BinaryNode;
    BinaryNode* root;

Теперь я хочу реализовать другой тип BinaryTree, который представляет собой кучу. Итак, я хочу наследоваться от BinaryTree и добавить одно поле, это поле является указателем типа BinaryNode, который указывает на последний лист в куче (кучи — это полные деревья, так что, если последний уровень не заполнен, последний лист — это лист в правом кончике).

      #ifndef HEAP_H
#define HEAP_H
#include "BinaryTree.h"


template <class T,class U>
class Heap : public BinaryTree<T,U>
{
public:
//|--------------------- Constructors ----------------------|
    Heap() : lastLeaf(NULL) {}

//|-------------------- Private fields ---------------------|
private:
    BinaryNode* lastLeaf;
    

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

      error: 'BinaryNode' does not name a type; did you mean 'BinaryTree'?|

Теперь, если я попробую вместо этого:

      struct BinaryNode* lastLeaf;

Кроме того, везде я использую BinaryNode* в программе получаю ошибку:

      error: 'BinaryNode' has not been declared

Так что дело не только в определении поля.

Что я могу сделать?

2 ответа

Ваш производный класс не знает, к каким параметрам шаблона применить BinaryNode. Поэтому вам нужно:

      template <class T,class U>
class Heap : public BinaryTree<T,U>
{
    // ...
    typename BinaryTree<T,U>::BinaryNode* lastLeaf;
};

Живая демонстрация


Согласно комментарию @AdrianMole, clang нуждается в typenameключевое слово здесь, поэтому я добавил это в свой ответ. И вам не нужно использовать typedef, см. обновленную демонстрацию.

Добавление этой строки:

      typedef struct BinaryTree<T,U>::BinaryNode BinaryNode;

к началу файла решил это.

Другие вопросы по тегам