В C ++ я могу определить указатель на член закрытого класса вне его области? - PullRequest
4 голосов
/ 07 января 2009

Рассмотрим:

class C {
private:
   class T {int a, b;};
};

C::T *p;

Как и ожидалось, это приводит к ошибке компиляции, говорящей, что C :: T является приватным в контексте строки 6.

Теперь измените это на указатель на член:

class C {
private:
   class T {int a, b;};
};

int C::T::*p;

На этот раз gcc версии 3.2.3 все еще подает такую ​​же жалобу, но gcc версии 3.4.3 позволяет ей пройти. Какое поведение соответствует стандарту?

Ответы [ 2 ]

3 голосов
/ 07 января 2009

Чтобы добавить к сообщению xtofl , см. Главу 11 ([class.access]) стандарта:

Членом класса может быть

- частный ; то есть его имя может использоваться только членами и друзьями класса, в котором оно
объявлен.

- защищено ; то есть его имя может использоваться только членами и друзьями класса, в котором оно находится объявлены, а также членами и друзьями классов, производных от этого класса (см. 11.5).

- публично ; то есть его имя может использоваться где угодно без ограничения доступа.

3 голосов
/ 07 января 2009

Поскольку T является невидимым откуда угодно, кроме самого класса C, я не могу себе представить, что это будет разрешено.

Попробовал это на Комау, и он сказал мне то же самое. К сожалению, я недостаточно разбираюсь в стандарте, поэтому не могу указать вам туда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...