Istnieje szereg części C++ 03, które niemal uniemożliwiają przodu deklaracje klas zagnieżdżonych. W szczególności, § 7.1.5.3 opracowany typu specyfikatory:
Jeśli opracowana-type-specifier jest jedynym składnikiem oświadczenie, deklaracja jest źle sformułowane, chyba że jest wyraźna specjalizacja (14.7.3), wyraźne instancji (14.7.2) lub ma jedną z następujących form:
class-keyidentifier ;
friend class-key ::optidentifier ;
friend class-key ::opttemplate-id ;
friend class-key ::optnested-name-specifieridentifier ;
friend class-key ::optnested-name-specifiertemplateopt
template-id ;
3.4.4 opisuje sposób wpływy wyszukiwanie nazw dla identyfikatora w specyfikator typu opracowanego. Jeśli identyfikator postanawia o nazwa-klasy lub enum-name The opracowana-type-specifier wprowadza go do deklaracji ten sam sposób prosty typu specifier wprowadza jego nazwa-typu. [...] Jeśli wyszukiwanie nazwy nie znajduje deklaracji dla nazwy, specyfikacja typu opracowanego jest niepoprawnie sformułowana, chyba że jest w postaci prostegoklucz klasy identyfikator, w którym to przypadku identyfikator jest deklarowane jak opisano w 3.3.1.
W skrócie, gdy identyfikator jest zawężona, kompilator musi spróbować rozwiązać ten identyfikator. Gdy zasięg jest klasą, kompilator musi wyszukać deklarację dla identyfikatora w zewnętrznej klasie. Kiedy klasa zewnętrzna nie została jeszcze zdefiniowana, nie można tego zrobić, a rezultatem jest źle sformułowany program.
Po prostu nie zagnieżdżaj B, jeśli tego potrzebujesz. (Możesz grupować klasy z przestrzeniami nazw Nesting - przynajmniej w C++ 03 - nie dodaje żadnej innej wartości.) – visitor
Nie jest możliwe, dopóki klasa "A" nie zostanie zdefiniowana. Musisz przeprojektować, aby nie używać klas zagnieżdżonych do czasu zdefiniowania klasy zawierającej klasę zagnieżdżoną. –
Zobacz także [Czy istnieje krótsza metoda przekazywania deklaracji klasy w przestrzeni nazw?] (Http://stackoverflow.com/questions/1368642). – outis