C ++ шаблоны и наследование - PullRequest
1 голос
/ 22 апреля 2010

У меня возникли проблемы с разбивкой кода на повторно используемые части с использованием шаблонов и наследования.Я хотел бы добиться, чтобы мой класс дерева и класс avltree использовали один и тот же класс узла, а класс avltree наследовал некоторые методы из класса дерева и добавил некоторые конкретные.Итак, я пришел с кодом ниже.Компилятор выдает ошибку в tree.h, как отмечено ниже, и я не знаю, как это преодолеть.Любая помощь приветствуется!:)

node.h:

#ifndef NODE_H
#define NODE_H
#include "tree.h"

template <class T>
class node
{
T data;
    ...

node()
    ... 

  friend class tree<T>;
};

#endif

tree.h

#ifndef DREVO_H
#define DREVO_H

#include "node.h"

template <class T>
class tree
{
public: //signatures
    tree();
...

    void insert(const T&);
private:
    node<T> *root; //missing type specifier - int assumed. Note: C++ does not support default-int


};
//implementations

#endif

avl.h

#ifndef AVL_H
#define AVL_H

#include "tree.h"
#include "node.h"

template <class T>
class avl: public tree<T>
{
public: //specific
    int findMin() const;
...

protected:
    void rotateLeft(node<T> *)const;
private:
    node<T> *root;

};

#endif

avl.cpp (Iпопытался отделить заголовки от реализации, это работало до того, как я начал комбинировать код avl с кодом дерева)

#include "drevo"
#include "avl.h"
#include "vozlisce.h"

template class avl<int>; //I know that only avl with int can be used like this, but currently this is doesn't matter :)
//implementations
...

Ответы [ 4 ]

8 голосов
/ 22 апреля 2010

Оба tree.h и node.h пытаются включить друг друга, охранники включения не дадут одному из них увидеть другого.

Вместо #include "tree.h" попробуйте объявить дерево следующим образом:

template <class T>
class tree;

в node.h

РЕДАКТИРОВАТЬ: Как предложил sbi в комментарии, более разумно направить объявление tree в node.h, чем наоборот, поскольку речь идет о предоставлении tree доступа к node через friend декларацию.

2 голосов
/ 22 апреля 2010

Не включайте "tree.h" в "node.h".

Кроме того, вы объявили root в классах tree и avl. Укажите tree::root как protected и удалите avl::root.

1 голос
/ 22 апреля 2010

Ваша проблема в том, что tree.h включает в себя node.h и наоборот. Я бы не подумал, что узлу необходимо (или имеет большой смысл) знать о дереве или предоставить ему дружбу, поэтому я бы удалил это.

0 голосов
/ 22 апреля 2010

Проблема заключается в круговой зависимости заголовочных файлов между tree.h и node.h.Так как node.h включает tree.h, при компиляции класса дерева компилятор не знает, какой тип узла.Поскольку вы используете его только для объявления друга, нет необходимости включать файл заголовка tree.h в node.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...