【问题标题】:I keep getting an error saying my class does not name a type我不断收到错误消息,说我的班级没有命名类型
【发布时间】:2011-02-03 20:54:28
【问题描述】:

我有一个类,称为 A,它有自己的头文件。然后我有另一个类,叫做 B,它也有它自己的头文件。它们每个都有自己的 .cpp 文件,我在其中实现了它们的所有功能。

我试图让 B 类有一个 A 类类型的变量作为私有变量,但我不断收到错误“A”没有命名类型

我的代码如下所示:

main.h:

#ifndef MAIN_H
#define MAIN_H

#include "A.h"
#include "B.h"

#endif

main.cpp:

#include "main.h"

int main( int argc, char* args[]) {
  B test;
}

啊哈:

#ifndef A_H
#define A_H

#include "main.h"

class A {
  public:
    //public functions
  private:
    //private variables
};
#endif

B.h:

#ifndef B_H
#define B_H

#include "main.h"

class B {
  public:
    //public functions...
  private:
    A temp;
}
#endif

所以我所有的包含都在 main.h 中,它在 B 之前包含 A。B 有一个类型为 A 的变量,但它包含在 main.h 中,而 B.h 包含 main.h。但是,我不断收到一条错误消息:

error: 'A' does not name a type.

我做了一些谷歌搜索,这似乎意味着 A 在您使用它时没有定义,但它应该在那里定义,因为它包含在 main.h 中,对吧?

【问题讨论】:

  • 为什么不把B.h 包括在main.cppA.hB.h 中?只包括你需要的东西。我很好奇您的编译器是否对包含递归感到困惑。 main.h -> A.h -> main.h
  • @Mark Loeser:保护常量 (xx_H) 可以避免递归问题,但是包含策略确实非常奇怪。
  • @trojanfoe:是的......这是漫长的一天。我真的应该回家了:)

标签: c++ class


【解决方案1】:

问题是A.h包含main.h,其中包含B.h,它试图使用A

组织文件的好方法是这样的:

main.h:

// not needed

main.cpp:

#include "B.h" // for using class B

int main( int argc, char* args[]) {
  B test;
}

啊哈:

#ifndef A_H
#define A_H

// no includes needed ATM

class A {
  //...
};
#endif

B.h:

#ifndef B_H
#define B_H

#include "A.h" // for using class A

class B {
  //public functions...
}
#endif

这样,B.h自包含的 并且可以使用而无需在其前面包含任何其他内容。一旦您的项目发展到现在的玩具水平以上,这一点就非常重要。为什么有人试图使用 x.h 提供的标头需要知道还包括 f.hm.hu.h

【讨论】:

  • 这是有道理的,但是我将所有内容都包含在 main.h 中并且将所有内容都包含在 main.h 中的原因是因为否则我总是无法包含其他内容。我有一堆不同的类都需要 SDL.h,之前包含它没有问题,但是现在我改变了所有内容的包含方式,我的一半需要 SDL.h 的文件都说其中的 SDL 函数是未定义的,即使我在该文件的顶部包含 SDL.h。
  • 没关系,在我重新排列我的代码后,在代码块中链接 SDL 的默认设置显然不起作用。我直接链接了 -lSDL 和 -lSDLmain 而不是 sdl-config,现在它似乎可以编译了。谢谢!
【解决方案2】:

如果您添加 ; 您提供的代码将正确编译在 B.h 结尾

更好的方法是在“B.h”中#include“A.h”,而不是#include“main.h”

但这可能与您的问题无关。

如果您使用模板而忘记了“typename”,这种错误也可能会令人困惑。

【讨论】:

    【解决方案3】:

    A.h 在顶部包含 Main.h。

    Main.h 跳过 A.h,因为 A_H 已定义,然后包含 B.h。

    B.h 尝试使用A,但是 A.h 还没有完成编译所以没有定义类型。

    【讨论】:

    • 发布的代码确实有效。它首先包含main.h,main.h包含A.h,所以A在B需要的时候已经声明了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2014-04-12
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多