由于私有继承而无法访问的类型

时间:2011-11-04 14:50:10

标签: c++ inheritance private

g++拒绝我访问某个类型,只是因为它碰巧是私人的祖父。这有意义吗?

struct A {};

struct B : private A {};

struct C : B {
  void foo(A const& a) {}
};

编译它会产生:

1:10: error: ‘struct A A::A’ is inaccessible
6:12: error: within this context

我的观点是:我从不想作为祖先访问A。事实上,如果AB的私人祖先,除了B(即C)之外,任何人都不应该完全看不到它吗?

当然,我可以使用protected继承,但就我而言,它确实没有意义。

2 个答案:

答案 0 :(得分:13)

这是因为A中注入的班级名称隐藏了A内的全局C。虽然A是可见的,但它不可访问(因为它是作为私有导入的),因此错误。您可以通过在全局命名空间中查找A来访问它:

void foo(::A const& a) {}

答案 1 :(得分:8)

如果你按照以下方式声明它就可以了

struct A {};

struct B : private A {};

struct C : B {
  void foo(::A const& a) {}
};

您所看到的错误是名称解析无法访问。 :: A表示查看全局命名空间而不是我继承的嵌套类类型。还记得私有继承只是说B有一个A而IMOHO是一个应该避免的愚蠢语言特性。