클래스 멤버를 선언하면 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++에서 순방향 선언과 중첩 클래스는 다루기 힘든 주제라는 것을 알고있다.)하지만 컴파일러는 왜 두 번째 버전을 전역 이름으로 해석 하는가?
'struct Bar * m_bar;'는 * 클래스 정의 *에'struct bar '를 추가하지 않는다는 사실을 알고 있습니다. 단지 "바 (Bar)"라는 주변 클래스가 있습니다. " 첫 번째 버전은 먼저 중첩 된 클래스 선언을'Foo' 클래스 정의에 추가 한 다음'Bar *'는 * that * 중첩 클래스를 참조합니다. –