C ++ - 链接列表代码 - 未在此范围内声明LNode

时间:2016-03-21 20:10:25

标签: c++ linked-list operator-overloading

我正在为C ++中的链表编写一个类,我在为<<来编写运算符重载时遇到了问题。我的班级'标题是:

class LList
{
   private:
      struct LNode
      {
         LNode ();
         int data;
         LNode * next;
      };
   public:
      LList ();
      LList (const LList & other);
      ~LList ();
      LList & operator = (const LList & other);
      bool operator == (const LList & other);
      int Size () const;
      friend ostream & operator << (ostream & outs, const LList & L);
      bool InsertFirst (const int & value);
      bool InsertLast (const int & value);
      bool DeleteFirst ();
      bool DeleteLast ();
   private:
      LNode * first;
      LNode * last;
      int size;
};

并且运营商是:

ostream & operator << (ostream & outs, const LList & L){ 
    LNode *np;
    np=L.first;
    while(np!=NULL){
        outs<<np->data;
        np=np->next;
    }
    return outs;
}

编译代码时出现错误:

LList.cpp: In function ‘std::ostream& operator<<(std::ostream&, const LList&)’:
LList.cpp:36:2: error: ‘LNode’ was not declared in this scope
  LNode *np;
  ^
LList.cpp:36:9: error: ‘np’ was not declared in this scope
  LNode *np;

我以为我可以在友元函数中实例化一个结构,但看起来它不起作用。你们中的任何人都知道发生了什么事吗?

3 个答案:

答案 0 :(得分:2)

由于您的operator<<是全局函数,因此您需要使用以下命令访问内部类:

LList::LNode *np;

由于此函数是friend的{​​{1}},因此它可以访问私有LList类。

答案 1 :(得分:2)

由于operator<<重载是非成员函数,因此您需要使用LList::LNode

ostream & operator << (ostream & outs, const LList & L){ 

    LList::LNode *np;
 // ^^^^^

    np=L.first;
    while(np!=NULL){
        outs<<np->data;
        np=np->next;
    }
    return outs;
}

答案 2 :(得分:2)

那是因为LNode不在全局范围内,它是LList的嵌套类。你必须写:

ostream & operator << (ostream & outs, const LList & L){ 
    LList::LNode *np = L.first;
    ↑↑↑↑↑↑↑
    /* rest as before */
}