错误:未命名类型,将指向类的指针设置为 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;

代码编译良好。所以我错过了NodeLinkedList 之间的一些交互。这是什么?

【问题讨论】:

使用 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的主要内容,如果未能解决你的问题,请参考以下文章

类和对象的命名空间

编程中常见的命名法有那些

使用指向类私有方法的指针的命名参数惯用语

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

git:使用分支

已声明“未命名类型”错误