【问题标题】:Declaring nested classes before they are defined在定义嵌套类之前声明它们
【发布时间】:2011-11-17 11:02:33
【问题描述】:

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

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)。有什么办法可以做到吗?

【问题讨论】:

  • 如果您需要,请不要嵌套 B。 (您可以使用命名空间对类进行分组。嵌套 - 至少在 C++03 中 - 不会增加其他价值。)
  • 在定义类 A 之前是不可能的。您必须重新设计,以便在定义包含嵌套类的类之前不使用嵌套类。

标签: c++


【解决方案1】:

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

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

    class-key identifier ;
    朋友 class-key ::optidentifier ;
    朋友 class-key ::opttemplate-id ;
    朋友 class-key ::optnested-name-specifier identifier ;
    朋友 class-key ::optnested-name-specifier templateopt模板-id ;
    
  2. 3.4.4 描述了如何在 elaborated-type-specifier 中为 identifier 进行名称查找。如果标识符解析为 class-nameenum-name,则 elaborated-type-specifier 以与 a 相同的方式将其引入声明simple-type-specifier 引入了它的type-name。 [...] 如果名称查找没有找到名称的声明,则详细说明类型说明符格式错误,除非它是简单的形式 class-key identifier i> 在这种情况下,标识符按照 3.3.1 中的描述进行声明。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-09-30
      • 2010-10-31
      相关资源
      最近更新 更多