2011-11-17 216 views
5

我可以聲明一個指向一類尚未定義,這樣才:聲明嵌套類定義它們的

class A ; 
A* p ; 

但是我怎麼做到這一點的一個嵌套類?我想這樣做:

class A ; 
class A::B ; // error: 'B' in class 'A' does not name a type 
A::B* p ; 

但它不編譯(使用g ++ 4.5.2)。有什麼辦法可以做到這一點?

+0

只要不需要嵌套B,如果你需要這個。 (你可以用命名空間對類進行分組,嵌套 - 至少在C++ 03中 - 不會增加其他值)。 – visitor

+0

只有定義了類「A」後才能實現。您必須重新設計,以便在包含嵌套類的類的定義之後才能使用嵌套類。 –

+0

另請參見[是否有更簡單的方法來轉發在名稱空間中聲明類?](http://stackoverflow.com/questions/1368642)。 – outis

回答

4

C++ 03中有許多部分不允許嵌套類的前向聲明。特別是,第7.1.5.3闡述類型指示符:

  1. 如果闡述型說明符是聲明的唯一組成部分,是形成不良的聲明,除非它是一個明確的專業化( 14.7.3)中,顯式實例(14.7.2),或者它具有下列形式之一:

    class-keyidentifier ; 
    friend class-key ::optidentifier ; 
    friend class-key ::opttemplate-id ; 
    friend class-key ::optnested-name-specifieridentifier ; 
    friend class-key ::optnested-name-specifiertemplateopt 
    template-id ; 
    
  2. 3.4.4描述瞭如何在一個名稱查找前進用於標識符詳細說明類型說明符。如果標識符解析爲類名枚舉名,所述闡述型說明符將其引入聲明的相同的方式簡單型說明符引入其類型名稱。 [...]如果名稱查找沒有找到該名稱的聲明,則詳細類型說明符是格式錯誤的,除非它是簡單形式 class-key identifier在這種情況下標識符是如3.3.1所述進行申報。

總之,當一個標識符的作用域,編譯器必須設法解決這個標識符。當範圍是一個類時,編譯器必須在外部類中查找該標識符的聲明。當外部類還沒有被定義時,這是不能完成的,結果是一個不合格的程序。

3

考慮命名空間而不是嵌套類。

class A; 
A * pa; 
namespace A_help 
{ 
    class B; 
} // namespace A_help 
A_help::B * pb;