簡體   English   中英

編譯器錯誤:錯誤:“ ListNode”未命名類型

[英]Compiler Error: error: ‘ListNode’ does not name a type

我正在嘗試編寫我的類和結構實現文件。 該類具有來自struct的變量。 我不斷收到錯誤:

LinkedList.h:70:8:錯誤:“ ListNode”未命名類型為ListNode *頭;

LinkedList.h:71:8:錯誤:“ ListNode”未命名類型ListNode *游標;

LinkedList.h看起來像這樣:

#ifndef CLASS_LINKEDLIST_H
#define CLASS_LINKEDLIST_H

// Header files 

#include <iostream>
#include "ListNode.h"

using namespace std;

class LinkedList 
   {
    public:
    LinkedList( int maxSize = 10 );
    LinkedList( const LinkedList& other );
    ~LinkedList();

    private:

       ListNode* head;
       ListNode* cursor;

       int capacity;
       int size;
   };

#endif // ifndef CLASS_LINKEDLIST

ListNode.h是這樣的結構:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

using namespace std;

struct ListNode
   {
     ListNode( int nodeData, ListNode* nextPtr);
     int dataItem;
     ListNode* next;
   };
#endif  // STRUCT_LISTNODE_H

ListNode.cpp看起來像這樣:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#include "ListNode.h"
#include <iostream>

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

這是LinkedList.cpp的頂部

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

// header files
#include "LinkedList.h"

我不允許更改.h文件,只能更改.cpp文件。 我知道我忘了包含一些簡單的內容,但似乎無法弄清楚。

感謝您的任何幫助。

放置了包括保護,以便如果一個文件最后被多次包含,則僅使用一次。

包含文件時,出於所有目的和目的,它都已復制粘貼到包含文件中,因此對於編譯器的預處理器,ListNode.cpp如下所示:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

using namespace std;

struct ListNode
   {
     ListNode( int nodeData, ListNode* nextPtr);
     int dataItem;
     ListNode* next;
   };
#endif  // STRUCT_LISTNODE_H
#include <iostream> //contents of iostream go on for pages. Let's skip those, shall we?

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

分解后,編譯器將看到:

#ifndef STRUCT_LISTNODE_H

如果尚未定義STRUCT_LISTNODE_H,請執行所有操作,直到對應的#endif為止。

#define STRUCT_LISTNODE_H 

涼。 剛定義了STRUCT_LISTNODE_H。

#ifndef STRUCT_LISTNODE_H

這次已定義STRUCT_LISTNODE_H,因此我們跳到相應的endif:

#endif  // STRUCT_LISTNODE_H

是的,頭文件幾乎被完全丟棄。 所以要編譯的是:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#ifndef STRUCT_LISTNODE_H
#endif  // STRUCT_LISTNODE_H
#include <iostream> //contents of iostream go on for pages. Let's skip those, shall we?

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

沒有ListNode定義的跡象。

因此,這並不是說要在cpp文件中使用OP包含保護,(而絕不應該包含cpp文件,因此不需要包含保護),但是OP兩次使用了相同的包含保護。

作為一項公共服務公告,有關using namespace std;的常見警告using namespace std; 這個邪惡的小捷徑將整個標准庫拉入全局名稱空間。 這意味着如果您有一個名為reverse的函數,它現在必須使用std::reverse來解決它,您可能不喜歡誰贏了,這對程序的執行有什么影響。

那么好吧。 您的代碼就可以了,但是如果您包含其他人的代碼呢? 現在,他們與他們本來不想使用的名稱發生沖突,並且您收到了他們從未見過且很可能無法幫助您的奇怪錯誤消息。

謹慎使用。 帶有std ::的前綴

std::cout << "HI!" << std::endl;

或僅將所需的部分放入全局名稱空間

using std::cout;
using std::endl;

然后

cout << "HI!" << endl;

最重要的是,在包含其他所有人的頭文件之后最后執行此操作,因為您不知道它們將如何響應。 但這是您懶惰的問題。 糟透了。

這使我們明白了為什么不using namespace std; 在標題中。 一些糟糕的吸盤包括您的標頭以使用您的庫。 HAM! 他們繼承了您不好的編碼風格。 他們為您的錯誤而受苦。 那不酷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM