2016-01-15 34 views
1

我想實現一個堆,但是我的函數中有一個上面的錯誤。不可識別的模板聲明/定義

這是我的頭文件:

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

回答

5

編譯器抱怨着Node<E>;在全球範圍內沒有名爲Node的模板。代碼必須說它是成員模板:

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

您需要在那裏有一個'typename'。或者,如果他正在使用C++ 11,則可以執行'堆 :: getRoot() - >節點 *'。 – 0x499602D2

+0

@ 0x499602D2 - 增加了'typename'。謝謝。我通常的做法是讓它離開,看看編譯器是否抱怨。 –

+0

哦,這很聰明。非常感謝 –