2011-03-10 121 views
3

我正在編譯一個項目,在RHEL 5.0下的linux 3下編譯,因此使用gcc編譯器版本4.1.1。 我有一行這樣的錯誤:ISO C++禁止聲明沒有類型的「節點」

inline Tree<ExpressionOper<T> >::Node* getRootNode() const throw() { return m_rootPtr; } 

按照包括在上面的tree.h中,這裏是一個類的模板聲明:

template <typename T> 
class Tree 
{ 
public: 
class Node 
    { 
    public: 

    Node() 
     : _parent (NULL) {}; 

    explicit Node (T t) 
     : _parent (NULL) 
     , _data (t) {}; 

    Node (T t, Node* parent) 
     : _parent (parent) 
     , _data (t) {}; 

    ~Node() 
    { 
     for (int i = 0; i < num_children(); i++){ 
     delete (_children [ i ]); 
     } 
    }; 

    inline T& data() 
    { 
     return (_data);   
    }; 

    inline int num_children() const 
    { 
     return (_children.size());  
    }; 

    inline Node* child (int i) 
    { 
     return (_children [ i ]);  
    }; 


    inline Node* operator[](int i) 
    { 
     return (_children [ i ]);  
    }; 

    inline Node* parent() 
    { 
     return (_parent); 
    }; 

    inline void set_parent (Node* parent) 
    { 
     _parent = parent; 
    }; 

    inline bool has_children() const 
    { 
     return (num_children() > 0); 
    }; 

    void add_child (Node* child) 
    { 
     child -> set_parent (this); 
     _children.push_back (child); 
    }; 

    private: 
    typedef std::vector <Node* > Children; 
    Children _children; 
    Node*  _parent; 
    T   _data; 

    }; 

提前非常感謝。

回答

5

嘗試以下內容,閱讀this

inline typename Tree<ExpressionOper<T> >::Node* getRootNode() const throw() 
{ 
    return m_rootPtr; 
} 

總之,由於ExpressionOper<T>是一個模板類型,在分析階段,編譯器並不真正知道什麼樣的Tree<ExpressionOper<T> >的內容是(直到它知道T)。因此,它不知道Tree<ExpressionOper<T> >::Node。您可以使用typename關鍵字向編譯器提示您的意思是一種類型,然後解析可以成功。符號查找稍後會在編譯過程中發生。

你有特定的錯誤是編譯器的怪癖,因爲它沒能注意到你有一個類型,它旁邊假設你試圖在命名空間來聲明一個變量稱爲「節點」或類Tree<ExpressionOper<T> >,當然,如果你一直這樣做,那麼你會錯過它的類型。

+0

啊哈哈 - 你剛到那裏第一次......更好的解釋,但! – Nick 2011-03-10 16:26:47

+0

@Nick:Teeheehee :) – 2011-03-10 16:27:13

1

也許你需要使用typename關鍵字:

inline typename Tree<ExpressionOper<T> >::Node* etc... 
相關問題