2016-03-21 16 views
0

C++でリンクリストのクラスを作成していますが、< <の演算子オーバーロードを記述する際に問題が発生しています。C++ - リンクされたリストコード - このスコープでLNodeが宣言されていません

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

、オペレータは次のとおりです:私のクラスのヘッダーがあり、私は内部の構造体をインスタンス化できると思っていた

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; 

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

私は、コードをコンパイルすると、私はエラーを取得します友人の機能が動作しないように見えます。あなたは何が起こっているのか知っていますか?

答えて

2

あなたoperator<<がグローバル関数であるので、あなたがあなたの内部クラスにアクセスする必要があります:この関数はLListfriendあるので

LList::LNode *np; 

、それはプライベートLNodeクラスにアクセスすることができます。

2

operator<<オーバーロードはメンバー以外の機能なので、LList::LNodeを使用する必要があります。 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

、それはLListの入れ子になったクラスです。あなたは書く必要があります:

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

私はとても遅いです... – Barry

関連する問題