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