Неузнаваемое объявление/определение шаблона

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

Вот мой заголовочный файл:

template <typename E>
class Heap
{
private:
    class Node {
        E data;
        Node * left;
        Node * right;
    };

    Node root;
    int length;

    E * preorder(E * list, int length, Node node);
    E * inorder(E * list, int length, Node node);
    E * postorder(E * list, int length, Node node);
    void clear(Node node);  //Recursively clears all nodes and frees all pointers
public:
    Heap();
    Heap(E * list, int length);
    ~Heap();

    Node * getRoot();
    void buildHeap(E * list, int length);
    E * returnList();
};

И о конкретной функции идет речь (хотя и на других есть подобные ошибки). Ошибка во второй строке

template <typename E>
Node<E> * Heap<E>::getRoot() {
    return &root;
}

person Oren Bell    schedule 15.01.2016    source источник


Ответы (1)


Компилятор жалуется на Node<E>; в глобальной области видимости нет шаблона с именем Node. Код должен сказать, что это шаблон участника:

template <typename E>
typename Heap<E>::Node * Heap<E>::getRoot() {
    return &root;
}
person Pete Becker    schedule 15.01.2016
comment
Вам нужен typename там. Или вы можете сделать Heap<E>::getRoot() -> Node<E>*, если он использует C++11. - person 0x499602D2; 16.01.2016
comment
@ 0x499602D2 — добавлено typename. Спасибо. Мой обычный подход состоит в том, чтобы оставить его и посмотреть, не жалуется ли компилятор. - person Pete Becker; 16.01.2016