私有继承隐藏基类,"在此上下文中无法访问"错误

ste*_*liu 18 c++

我有一个类似于以下链接中描述的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类给出"在此上下文中不可访问"错误: http:// bytes .COM /主题/ C /答案/ 164246-私有继承的呈现级不可访问

在上面的例子中,使用:: X显式引用X,但如果代码位于如下函数中,该怎么办?

void fooby()
{
    class X {};

    class Y : private X {};

    class Z : public Y
    {
    public:
        X x; // compiler "inaccessible within this context" error
    };
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下你如何引用X?

如果fooby是一个结构/类,那么:: fooby :: X可以工作,但我不知道如何在上面的情况下这样做.

Dav*_*eas 11

您面临的问题是XY(和所有派生类型)中引用了一个注入的标识符,该标识符在XY下方不可访问.

在命名空间级别声明的用户定义类型的常见情况下,您可以使用命名空间来限定类型并获得访问权限:

class X {};
class Y : X {};
class Z : Y {
   ::X x;            // or Namespace::X
};
Run Code Online (Sandbox Code Playgroud)

因为您在函数内定义了不是有效选项的类型.

或者,您可以通过其他解决方法解决问题.正如@Eugene建议的那样,您可以创建一个替代标识符来引用X:

typedef class X {} another_name;
class Y : X {};
class Z : Y { 
   another_name x;
};
Run Code Online (Sandbox Code Playgroud)

或者您可以添加typedef内部Y以提供派生类型的类型:

class X {};
class Y : X {
public:
   typedef X X;
};
class Z : Y {
   X x;
};
Run Code Online (Sandbox Code Playgroud)

这最后的选择工作,因为它会增加一个X标识符内Ypublic,指的是类型,所以编译器会在那里找到的类型和使用,在Z.


ham*_*ene 9

好问题,我找不到办法做到这一点.我看到的唯一选择是在Z之外引入typedef:

typedef X PITA;
class Z : public Y
{
public:
    PITA x; // ok
};
Run Code Online (Sandbox Code Playgroud)