Недоступный тип из-за частного наследования - PullRequest
14 голосов
/ 04 ноября 2011

g++ отказывает мне в доступе к типу только потому, что это частный дедушка.Имеет ли это смысл?

struct A {};

struct B : private A {};

struct C : B {
  void foo(A const& a) {}
};

Компиляция дает:

1:10: error: ‘struct A A::A’ is inaccessible
6:12: error: within this context

Моя точка зрения такова: я никогда не хотел обращаться к A как к предку.Фактически, если A является частным предком B, разве это не должно быть абсолютно невидимым для кого-либо, кроме B (то есть C)?

Конечно, я мог бы использовать protected наследование, но в моем случае это не имеет смысла.

Ответы [ 2 ]

13 голосов
/ 04 ноября 2011

Это связано с тем, что введенное имя класса из A скрывает глобальный A внутри C. Хотя A является видимым, оно недоступно (так как оно импортировано как частное), поэтому возникает ошибка. Вы можете получить доступ к A, просмотрев его в глобальном пространстве имен:

void foo(::A const& a) {}
8 голосов
/ 04 ноября 2011

если вы объявите это следующим образом, то оно будет работать

struct A {};

struct B : private A {};

struct C : B {
  void foo(::A const& a) {}
};

Ошибка, которую вы видите, состоит в том, чтобы разрешить имя, а не получить доступ. :: A говорит, что посмотрите на глобальное пространство имен, а не на мои унаследованные вложенные типы классов. Также помните, что частное наследование просто говорит, что у B есть A, а IMOHO - глупая языковая особенность, которую следует избегать.

...