C++ 私有继承使用“隐藏基类”;在此上下文中不可访问”;错误

C++ 私有继承使用“隐藏基类”;在此上下文中不可访问”;错误,c++,C++,我遇到了一个与以下链接中描述的问题类似的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类会出现“在该上下文中不可访问”错误: 在上述情况下,使用::X显式引用X是可行的,但如果代码位于以下函数中,该怎么办 void fooby() { class X {}; class Y : private X {}; class Z : public Y { public: X x; // compiler "inaccessible w

我遇到了一个与以下链接中描述的问题类似的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类会出现“在该上下文中不可访问”错误:

在上述情况下,使用::X显式引用X是可行的,但如果代码位于以下函数中,该怎么办

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
失败。