2011-08-12 40 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++書籍中教過的,說「只要做,相信我」的整潔東西,通常會幫助你避免這些類型的編譯問題。