C++ 私有继承使用“隐藏基类”;在此上下文中不可访问”;错误
我遇到了一个与以下链接中描述的问题类似的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类会出现“在该上下文中不可访问”错误: 在上述情况下,使用::X显式引用X是可行的,但如果代码位于以下函数中,该怎么办C++ 私有继承使用“隐藏基类”;在此上下文中不可访问”;错误,c++,C++,我遇到了一个与以下链接中描述的问题类似的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类会出现“在该上下文中不可访问”错误: 在上述情况下,使用::X显式引用X是可行的,但如果代码位于以下函数中,该怎么办 void fooby() { class X {}; class Y : private X {}; class Z : public Y { public: X x; // compiler "inaccessible w
void fooby()
{
class X {};
class Y : private X {};
class Z : public Y
{
public:
X x; // compiler "inaccessible within this context" error
};
};
在这种情况下,如何引用X
如果fooby是一个结构/类,那么::fooby::X可以工作,但我不确定在上面的例子中如何工作。好问题,我找不到一种方法来做到这一点。我看到的唯一选择是在Z之外引入typedef:
typedef X PITA;
class Z : public Y
{
public:
PITA x; // ok
};
您面临的问题是,在
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;
};
或者,您可以在Y
中添加typedef
,为派生类型提供类型:
class X {};
class Y : X {
public:
typedef X X;
};
class Z : Y {
X x;
};
最后一个选项之所以有效,是因为它将在
Y
中添加一个X
标识符,该标识符是public
并引用该类型,因此编译器将在那里找到该类型,并在Z
中使用该标识符?也许这会对另一个建议有所帮助。@Mark B-这只是一个简单的人为的例子来说明我试图理解+1的行为。这是一个很好的答案,我今天学习了如何以不同的方式使用class
。你的“下一个选项”(“class X;”)是错误的。这是行不通的——它是一样的,指的是私有继承的注入类名,因此无法访问。您似乎误解了注入的类名是一个对象而不是一个类型。注入的类名引用了一个类,是一个类型名。@Johannes:是的,你说得对,我有这个误解。我实际上是想在标准中查找它(g++接受它4.2/4.7,但clang++和comeau拒绝它)。似乎类X代码>和identity::type
失败。