2011-03-10 128 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...