В C ++ 03 вложенный класс не может получить доступ к private
и protected
членам включающего класса по умолчанию (см. §11.8 / 1). Но если вы сделаете их друзьями окружающего класса, они смогут получить к ним доступ. Но опять же, вложенный класс вложенного класса все еще не является другом внешнего вложенного класса, вложенный класс вложенного класса не может получить доступ к закрытым и защищенным членам самого внешнего включающего класса; он не может даже получить доступ к закрытому и защищенному члену ближайшего окружающего класса, как отмечалось ранее. То, что вы делаете, это то, что не допускается.
Стандарт C ++ (2003) говорит в $ 11,8 / 1 [class.access.nest],
Члены вложенного класса не имеют
особый доступ к членам
включающий класс , ни к классам или
функции, которые подарили дружбу
вмещающему классу; обычный
правила доступа (пункт 11)
повиновался. Члены огороженного
класс не имеет специального доступа к
члены вложенного класса; обычный
правила доступа (пункт 11)
повиновался.
Пример из самого стандарта:
class E
{
int x;
class B { };
class I
{
B b; // error: E::B is private
int y;
void f(E* p, int i)
{
p->x = i; // error: E::x is private
}
};
int g(I* p)
{
return p->y; // error: I::y is private
}
};
Это дефект в стандарте C ++ 03.
Кстати, это дефект в стандарте C ++ 03. Поскольку вложенный класс является членом, он должен иметь доступ к закрытым и защищенным элементам, как и любой другой элемент:
§9.2 / 1 (C ++ 03):
Членами класса являются члены данных, функции-члены (9.3), вложенные типы … Вложенные типы - это классы (9.1, 9.7) и перечисления (7.2), определенные в классе…
См. Отчет о дефектах :