Не удается получить доступ к структуре, определенной в базовом классе
Я реализовал класс 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;
к началу файла решил это.