在此范围内没有声明另一个c++错误

Another C++ was not declared in this scope error

本文关键字:另一个 c++ 错误 声明 范围内      更新时间:2023-10-16

有几个问题与这个错误有关,但是每个问题实际上都与使用前未声明的对象或类型有关。例如:

 class A 
 {
   public:
     A_Object a_obj;   
 };

得到错误A_Object was not declared in this scope意味着没有在文件的任何地方声明A_object

注意:这是我对错误的理解。

现在我有一个名为Account.h的文件,如下所示:
#ifndef ACCOUNT_H_
#define ACCOUNT_H_
class Account
{
  //fields and methods
};
#endif /* ACCOUNT_H_ */

我还有第二个名为Address.h的文件,如下所示:

#ifndef ADDRESS_H_
#define ADDRESS_H_
#include "Account.h"
typedef Account account_type;//Error here
class Address
{
 //Fields and methods
};
#endif /* ADDRESS_H_ */

当我尝试编译这个文件时,我得到错误Account was not declared in this scope

知道为什么吗?

Account.h实际上也包括Address.h吗?这种循环引用似乎是最可能出现的情况。

在两个include文件的末尾是否有匹配的#endif ?

第一点,你对A_object的理解是不正确的,这个错误意味着A_object在第一次使用之前没有被声明,而不是没有在任何地方声明。

第二点,你发布的代码是不正确的,因为你在两个文件中都缺少#endif。但假设这是唯一缺失的代码,那么你就不会得到你所描述的错误。张贴有错误的真实代码

当Address.h包含Account.h时,我看到了这个错误,Account.h包含OtherFile.h, OtherFile.h又包含Address.h。有没有可能存在循环依赖?可能很难找到

这可能是对c/c++编译器如何工作的更核心的理解。包括块、前向声明、包括等等。所有这些概念对我来说都没有意义,直到我了解了编译器的基本工作原理。虽然我意识到这是对编译器理论/逻辑的过度简化,但请原谅我。

c++编译器执行的第一个步骤是预处理(预编译)步骤,它将所有需要的文件组合成一个大的平面文件。在"C"语言中,这些预编译器操作使用哈希(#)符号表示。"#include"所做的就是指示预编译器将这个文件放入整个"平面文件"中。如果你有一个循环包含,你的预编译器将进入一个无限循环并爆炸,或者说一些超级通用和有用的东西,如"符号已经被定义"。

Include块,前向声明,以及所有你在c++书籍中学到的"相信我,只管去做"的整洁的东西,通常会帮助你避免这些类型的编译问题。

相关文章: