Недопустимый тип из-за частного наследования
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 - это глупая языковая функция, которой следует избегать.