3

当向前声明一个类的成员时,你可以做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::BarBar

struct Foo {
  Foo();
  struct Bar* m_bar;
  struct Bar {
      int m_baz;
  };
};

Foo::Foo(){
    m_bar = new Foo::Bar;
}

我的问题更多是出于好奇而不是实际问题(我知道前向声明和嵌套类是 C++ 中的一个敏感主题),但为什么编译器将第二个版本解释为全局名称?

4

1 回答 1

2

规范在 3.3.2p6bullet2 中说明了这一点(它实际上只是说明了将声明的名称添加到哪个范围内。如果我没记错的话,没有明确的规则表明该类是该名称空间的成员)。

我认为这是一个重要的 C 兼容性特性。如果不是这样,则该类在 C 中将是全局的,但在 C++ 中是类成员。

于 2013-03-01T20:42:09.283 回答