Ответ 1
Класс A
содержит введенное имя класса A
в своей области (то есть A::A
относится к классу A
, если только это не относится к конструктору).
Класс B
наследует это, поэтому имя A
в пределах области B
относится к введенному классу-названию A
в области A
. Однако, поскольку A
является частным базовым классом B
, все имена в области A
являются частными внутри B
.
Класс C
снова наследует это, но он не может получить доступ к этому A
, поскольку он является закрытым в пределах B
. Отсюда и ошибка. Обратите внимание, что ошибка на самом деле связана с использованием имени A
в конструкции B<A>
.
Класс BA
не имеет этой проблемы, так как определение B<A>
не входит в сферу применения любого класса, поэтому имя A
относится к глобальному имени A
, а не к любому введенному классу -имя. И, конечно, имя BA
является общедоступным.
Вы можете легко решить это, присвоив имя A
в C
:
class C : public B<A>
{
public:
C() : B<::A>( 123 ) {}
};
Обратите внимание, что наследование конструктора не действует. Проблема заключается в доступе к имени класса A
(введенному в A
и унаследованному в B
и C
), а не к доступу к конструктору.