Недопустимый тип из-за частного наследования

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, но в моем случае это не имеет смысла.

Ответы

Ответ 1

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

void foo(::A const& a) {}

Ответ 2

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

struct A {};

struct B : private A {};

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

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