我有一个类似于以下链接中描述的问题,当我尝试在派生类中声明基类的成员时,私有继承的基类给出"在此上下文中不可访问"错误: 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
您面临的问题是X在Y(和所有派生类型)中引用了一个注入的标识符,该标识符在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标识符内Y即public,指的是类型,所以编译器会在那里找到的类型和使用,在Z.
好问题,我找不到办法做到这一点.我看到的唯一选择是在Z之外引入typedef:
typedef X PITA;
class Z : public Y
{
public:
PITA x; // ok
};
Run Code Online (Sandbox Code Playgroud)