在此范围内没有声明另一个c++错误
Another C++ was not declared in this scope error
有几个问题与这个错误有关,但是每个问题实际上都与使用前未声明的对象或类型有关。例如:
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++书籍中学到的"相信我,只管去做"的整洁的东西,通常会帮助你避免这些类型的编译问题。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口