错误:未命名类型,将指向类的指针设置为 0
Posted
技术标签:
【中文标题】错误:未命名类型,将指向类的指针设置为 0【英文标题】:error: does not name a type, when setting pointer to class to 0 【发布时间】:2014-06-22 18:51:15 【问题描述】:我正在尝试掌握 C++ 的基础知识,但我被这段代码卡住了:
#include<iostream>
using namespace::std;
class Node
public:
int x;
Node *ptr_next;
;
class LinkedList
public:
Node *head;
head = 0; //If I comment out this line the code compiles
;
int main()
LinkedList linked_list;
return 0;
当我运行上面的时候,我得到了这个错误:
error: ‘head’ does not name a type
我不明白为什么我不能将head
设置为0
;我查看了this question,似乎上述错误的一个可能原因是编译器不知道引用的类是什么(在我的情况下Node
是)。但是,这里不应该是这种情况,因为如果我只是将head
声明为指向Node
的指针,我的代码运行良好。当我尝试将head
设置为0
时,会引发上述错误。我错过了什么?
如果我忽略 LinkedList
类,并将 main
更改为:
int main()
Node *head;
head = 0;
return 0;
代码编译良好。所以我错过了Node
和LinkedList
之间的一些交互。这是什么?
【问题讨论】:
使用 NSDMI 或构造函数。 你不能编写代码来初始化类声明中的东西(除非使用了 const int 之类的东西),请使用构造函数来完成 谢谢你们,将构造函数添加到LinkedList
classed 解决了问题。
@MarcoA。 Yes you can. 需要 C++11 并在声明时正确放置。
语句只能出现在函数定义中,不能出现在类定义中。由于编译器此时并不期待声明,因此它会尝试(但失败)将 head = 0;
解析为声明。
【参考方案1】:
C++11 允许在类中初始化非静态数据成员;这在标准中被称为 brace-or-equal-initializer。初始化程序必须出现在数据成员的声明中。但是您试图在单独的语句中对其进行初始化。把代码改成
class LinkedList
public:
Node *head = nullptr; // don't use 0 to initialize pointers
;
而且,正如名称 brace-or-equal-initializer 所暗示的,初始化也可以使用 braced-init-list 来完成。所以下面的作品也可以
class LinkedList
public:
Node *head; // value-initializes the pointer
;
【讨论】:
以上是关于错误:未命名类型,将指向类的指针设置为 0的主要内容,如果未能解决你的问题,请参考以下文章