繁体   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