我可以声明一个指向尚未定义的类的指针,如下所示:
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 :(得分:4)
C ++ 03的许多部分都不允许嵌套类的前向声明。特别是,§7.1.5.3详细说明的类型说明符:
如果 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 ;- 醇>
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;