2011-08-12 41 views
0

已经询问了与此错误有关的几个问题,但它们中的每一个实际上都与未在使用前声明的对象或类型有关。例如:另一个C++未在此范围内声明错误

class A 
{ 
    public: 
    A_Object a_obj; 
}; 

获取错误A_Object was not declared in this scope意味着A_object未在文件中的任何位置声明。

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

现在我有一个名为Account.h文件,如下图所示:

#ifndef ADDRESS_H_ 
#define ADDRESS_H_ 
#include "Account.h" 

typedef Account account_type;//Error here 
class Address 
{ 
//Fields and methods 
}; 
#endif /* ADDRESS_H_ */ 

当我尝试编译该文件获得:

#ifndef ACCOUNT_H_ 
#define ACCOUNT_H_ 
class Account 
{ 
    //fields and methods 
}; 
#endif /* ACCOUNT_H_ */ 

我也有第二个文件,如下所示叫Address.h错误Account was not declared in this scope

任何想法为什么?

+0

你的'#endif'在哪里? –

+0

除了两个人现在提出的循环依赖之外,另一种可能是你有两个Account.h文件,而且你不包括你认为的那个。 – john

+1

如果'class Address'不依赖于'class Account'的实现,那么你可以转发 - 声明它而不是包含它。 – Neil

回答

2

Account.h其实还包括Address.h?这种循环参考似乎是最可能的情况。

+0

我已经检查了这两个文件和是的地址包含在帐户 – Bitmap

+0

你走了,问了一个问题,发布了一些代码,但是设法省去了导致问题的代码。总是会发生的。 – john

1

在两个包含文件的末尾是否有匹配的#endif

+1

你认为编译器会让它编译,如果它没有关闭? –

+0

@ yi_H:呃,呃,问题是编译器不对,对吧?你有没有使用过C++?你通常不会从大多数编译器那里得到漂亮的错误信息......尝试在类声明结尾处留下分号并包含该文件。你不会得到*你在这里忘记了一个分号*“ –

+0

这会给出一个不同的错误不是吗?如果它丢失了endifs,至少应该到Address声明的结尾,除非涉及到模板。 –

0

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

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

0

当Address.h包含Account.h,其中包含OtherFile.h,其中包含Address.h时,我已经看到此错误。是否有可能你有循环依赖?这可能很难找到。

+0

Mark B打败了我。 –

0

这可能是一个对c/C++编译器如何工作的核心理解。包括块,前向声明,包括等等。除非我理解编译器的工作原理,否则所有这些概念对我来说都没有意义。虽然我意识到这是对编译器理论/逻辑的过分简化,但请耐心等待。

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

包括块,前向声明和所有你在C++书籍中教过的,说“只要做,相信我”的整洁东西,通常会帮助你避免这些类型的编译问题。