我可以声明一个指向尚未定义的类的指针,如下所示:
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).有没有办法让这项工作?
C++03 的许多部分不允许嵌套类的前向声明。特别是 \xc2\xa7 7.1.5.3 详细的类型说明符:
\n\n\n\n\n\n
\n- \n
如果详细类型说明符是声明的唯一组成部分,则该声明是格式错误的,除非它是显式特化(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- \n
3.4.4 描述了如何在详尽类型说明符中对标识符进行名称查找。如果标识符解析为类名或枚举名,则详细类型说明符将其引入声明中,就像简单类型说明符引入其类型名一样。[...] 如果名称查找没有找到该名称的声明,则详细类型说明符的格式不正确,除非它是简单形式的类键标识符,在这种情况下,该标识符按照 3.3 中所述进行声明。 1.
简而言之,当标识符被限定作用域时,编译器必须尝试解析该标识符。当作用域是类时,编译器必须在外部类中查找标识符的声明。当外部类尚未定义时,这是无法完成的,结果是一个格式错误的程序。
\n| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |