在向前声明某个成员时,您可以class Bar; Bar* m_bar
或更短的class Bar* m_bar
。但名称解析似乎表现不同。
例如,这完全编译:
struct Foo {
Foo();
struct Bar;
Bar* m_bar;
struct Bar {
int m_baz;
};
};
Foo::Foo(){
m_bar = new Foo::Bar;
}
虽然这不是,但因为编译器认为m_bar
的类型不是Foo::Bar
而只是Bar
:
struct Foo {
Foo();
struct Bar* m_bar;
struct Bar {
int m_baz;
};
};
Foo::Foo(){
m_bar = new Foo::Bar;
}
我的问题更多是出于好奇而非实际问题(我知道前向声明和嵌套类在C ++中是一个敏感的主题),但为什么编译器会将第二个版本解释为全局名称?
答案 0 :(得分:2)
规范在3.3.2p6bullet2中说明了这一点(它实际上只是说明了声明名称添加到的范围。如果我没记错的话,没有明确的规则说该类是该命名空间的成员)。 / p>
我认为这是一个重要的C兼容性功能。如果不是这样,那么该类在C中是全局的,但在C ++中是一个类成员。