クラスのメンバーを転送宣言するときは、実行するか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 ++では厄介な問題であることを知っています)が、なぜコンパイラは2番目のバージョンをグローバル名として解釈するのですか?