ISO C++禁止声明没有类型的“Node”。

3

我正在将一个在Linux 3下编译的项目移植到RHEL 5.0上,因此使用的是gcc编译器版本4.1.1。在某一行代码中,我遇到了以下错误:

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;

  }; 

非常感谢您的提前帮助。

2个回答

5

请尝试以下方法,并阅读此文:

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 > >中声明一个名为“Node”的变量,当然,如果你真这样做了,那么你会错过它的类型。

啊哈哈 - 你刚刚抢先一步了...不过需要更好的解释! - Nick

1
也许你需要使用typename关键字:
inline typename Tree<ExpressionOper< T > >::Node* etc...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接