[英]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.