【问题标题】:N does not name a typeN 没有命名类型
【发布时间】:2015-11-03 09:49:32
【问题描述】:
// q.h file
#ifndef __Q_H__
#define __Q_H__


using namespace std;
#include "n.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string>


class Q
{
  public:
   Q();


  private:
   N* beginning; //error N does not name a type
   N* end;       //error N does not name a type
   int count;

};

#endif // end of file




// q.cpp file 
#include "q.h"
#include "n.h"
#include <iostream>
using namespace std;
#include<string>

Q::Q()
{

beginning = NULL;
end = NULL;

}


// n.h file
#ifndef _N_H__
#define _N_H__
using namespace std;
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <string>

#include "q.h"


class N
{
  public:

  N(int);
  // next is a pointer object of type N
  N* next;
  // memeber for Node class
  int value;
};
#endif

// n.cpp file 
#include<string>
#include "q.h"
#include "n.h"



N::N(int v)
{
    value = v;

}

我在以下几行中收到错误消息。我尝试更改用户命名空间标准;到每个文件的第一行,但这仍然不起作用。我也尝试过改变 q.h 和 n.h 的顺序,但它们仍然没有出现。

N* 开头; N* 结束;

我也知道一个很好的解决方案是使用“前向声明”,但这是我由某人提供给我的测试文件的一部分,因此我无法对类进行前向声明。

因此,如果有人可以请看一下,看看我如何解决这个问题。

谢谢。

【问题讨论】:

  • 使用 g++ 编译没有任何错误。话虽如此,您有很多不必要的包含。你不需要n.h in q.cppq.h in n.hq.h in n.cpp
  • 除了循环包含之外,您还为标题保护使用保留标识符。它们不能以双下划线或下划线和大写字符开头。

标签: c++ class pointers


【解决方案1】:

您有一个循环引用(q.h 包括 n.hn.h 包括 q.h)。发生此错误是因为编译器在 n.h 之前包含(可能是因为主程序)q.h。因此,q.h 需要包含一个空类声明,如下所示,Q 知道 N

... #include N类; Q级 { ...

如果您无法编辑这些文件,您仍然可以在“Q”类声明之前的任何位置添加空类声明(例如,在您的主程序中包含 q.h 之前)。但是,N 类不需要 Q 中的任何内容,因此您不需要在 n.h 中包含 q.h

【讨论】:

  • 我在那里写道,我不能添加一个空类,因为它是给我的测试文件。但我会尝试编辑循环引用。
  • 您可以在“Q”类声明之前的任何位置添加空类声明,即使在您的主程序中也是如此。我想你可以编辑你的主程序。
【解决方案2】:

由于#include 是通过某种方式完成的,其中预处理器只获取您在#include'ing 的文件并复制粘贴到#include 语句的位置,当n.h 正在处理时,它包括 q.h,然后类 Q 出现在类 N 之前。因此,它不知道N 是什么类,因为编译器以线性方式工作(从文件开头到结尾)。

因此,我的建议是从 n.h 中删除 #include "q.h" 语句,因为类 N 不使用类 Q

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 2023-04-07
    • 2021-02-03
    • 2017-04-01
    • 2015-06-09
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多