前向声明语法具有不同的行为

时间:2013-03-01 18:01:11

标签: c++ forward-declaration

在向前声明某个成员时,您可以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 ++中是一个敏感的主题),但为什么编译器会将第二个版本解释为全局名称?

1 个答案:

答案 0 :(得分:2)

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

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