声明嵌套类定义它们的
问题描述:
我可以声明一个指向一类尚未定义,这样才:声明嵌套类定义它们的
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)。有什么办法可以做到这一点?
答
C++ 03中有许多部分不允许嵌套类的前向声明。特别是,第7.1.5.3阐述类型指示符:
如果阐述型说明符是声明的唯一组成部分,是形成不良的声明,除非它是一个明确的专业化( 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-specifiertemplateopttemplate-id ;3.4.4描述了如何在一个名称查找前进用于标识符详细说明类型说明符。如果标识符解析为类名或枚举名,所述阐述型说明符将其引入声明的相同的方式简单型说明符引入其类型名称。 [...]如果名称查找没有找到该名称的声明,则详细类型说明符是格式错误的,除非它是简单形式 class-key identifier在这种情况下标识符是如3.3.1所述进行申报。
总之,当一个标识符的作用域,编译器必须设法解决这个标识符。当范围是一个类时,编译器必须在外部类中查找该标识符的声明。当外部类还没有被定义时,这是不能完成的,结果是一个不合格的程序。
答
考虑命名空间而不是嵌套类。
class A;
A * pa;
namespace A_help
{
class B;
} // namespace A_help
A_help::B * pb;
只要不需要嵌套B,如果你需要这个。 (你可以用命名空间对类进行分组,嵌套 - 至少在C++ 03中 - 不会增加其他值)。 – visitor
只有定义了类“A”后才能实现。您必须重新设计,以便在包含嵌套类的类的定义之后才能使用嵌套类。 –
另请参见[是否有更简单的方法来转发在名称空间中声明类?](http://*.com/questions/1368642)。 – outis