Ответ 1
Проблема, с которой вы сталкиваетесь, заключается в том, что в Y
(и всех производных типах) есть указатель X
, который ссылается на X
, который недоступен ниже Y.
В общем случае определяемых пользователем типов, объявленных на уровне пространства имен, вы можете использовать пространство имен для определения типа и получения доступа:
class X {};
class Y : X {};
class Z : Y {
::X x; // or Namespace::X
};
Потому что вы определяете свои типы внутри функции, которая не является допустимой.
В качестве альтернативы вы можете обойти проблему с другими обходными решениями. Как предложил @Eugene, вы можете создать альтернативный идентификатор для ссылки на X
:
typedef class X {} another_name;
class Y : X {};
class Z : Y {
another_name x;
};
Или вы можете добавить typedef
внутри Y
, чтобы предоставить тип производным типам:
class X {};
class Y : X {
public:
typedef X X;
};
class Z : Y {
X x;
};
Этот последний параметр работает, потому что он добавит идентификатор X
внутри Y
, который public
, и относится к типу, поэтому компилятор найдет там тип и использует его в Z
.