在定义嵌套类之前声明它们

Ton*_*nyK 5 c++

我可以声明一个指向尚未定义的类的指针,如下所示:

class A ;
A* p ;
Run Code Online (Sandbox Code Playgroud)

但是我如何为嵌套类做这个呢?我想做这个:

class A ;
class A::B ; // error: 'B' in class 'A' does not name a type
A::B* p ;
Run Code Online (Sandbox Code Playgroud)

但它没有编译(使用g ++ 4.5.2).有没有办法让这项工作?

out*_*tis 4

C++03 的许多部分不允许嵌套类的前向声明。特别是 \xc2\xa7 7.1.5.3 详细的类型说明符:

\n\n
\n
    \n
  1. 如果详细类型说明符是声明的唯一组成部分,则该声明是格式错误的,除非它是显式特化(14.7.3)、显式实例化(14.7.2)或具有以下形式之一:

    \n\n
    类键 标识符;\nfriend class-key :: opt 标识符;\nfriend class-key :: opt  template-id ; \nfriend类键:: opt 嵌套名称说明 符标识符;\nfriend类键:: opt 嵌套名称说明 符 template opt \n template-id ;\n
    \n
  2. \n
  3. 3.4.4 描述了如何在详尽类型说明符中对标识符进行名称查找。如果标识符解析为类名枚举名,则详细类型说明符将其引入声明中,就像简单类型说明符引入其类型名一样。[...] 如果名称查找没有找到该名称的声明,则详细类型说明符的格式不正确,除非它是简单形式的类标识符,在这种情况下,该标识符按照 3.3 中所述进行声明。 1.

  4. \n
\n
\n\n

简而言之,当标识符被限定作用域时,编译器必须尝试解析该标识符。当作用域是类时,编译器必须在外部类中查找标识符的声明。当外部类尚未定义时,这是无法完成的,结果是一个格式错误的程序。

\n