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

时间:2011-11-17 11:02:33

标签: c++

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

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)。有没有办法让这项工作?

2 个答案:

答案 0 :(得分:4)

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

  1. 如果 elaborated-type-specifier 是声明的唯一组成部分,则声明格式不正确,除非它是一个明确的专门化(14.7.3),一个明确的实例化( 14.7.2)或它具有以下形式之一:

    class-key identifier ; 
    friend class-key ::opt identifier ; 
    friend class-key ::opt template-id ; 
    friend class-key ::opt nested-name-specifier identifier ; 
    friend class-key ::opt nested-name-specifier templateopt
    template-id ;
    
  2. 3.4.4描述了如何在 elaborated-type-specifier 中对标识符进行名称查找。如果标识符解析为 class-name enum-name ,则 elaborated-type-specifier 将其引入声明中的方式与 simple-type-specifier 引入了 type-name 。 [...]如果名称查找没有找到名称的声明,则elaborated-type-specifier是格式错误的,除非它是简单形式 class-key 标识符在这种情况下,标识符的声明如3.3.1所述。

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

答案 1 :(得分:3)

考虑命名空间而不是嵌套类。

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