为什么禁止在后续的私有派生类中简单提及基指针/引用?

时间:2012-12-18 05:54:51

标签: c++ compiler-errors language-lawyer

struct B {};
struct D : private B {
  B* fun () { return new D; }  // ok
}
struct DD : public D {
  B* foo () { return 0; } // error: ‘struct B B::B’ is inaccessible !
};

这个错误对我来说似乎不合理。如果我们可以在全局范围内使用简单的B*那么为什么不在其私有派生类中呢? g++ demo

我们不会尝试将DD*转换为B*,这是语言规则禁止的thisthisthis是相关问题) 。
请注意,如果我将B* foo()更改为int foo(),情况就会好转。

3 个答案:

答案 0 :(得分:7)

显然编译器认为B指的是B的私有构造函数而不是类型。

符合条件的B显然修复了错误:

class B* foo () { return 0; }

或者这个:

::B* foo () { return 0; }

我不知道为什么会这样,但也许这会有所帮助。


更新:也许它与标准的11.2.4有关?唯一的问题是我的标准不足以完全理解它。

(对不起图像,复制/粘贴对我不起作用)

答案 1 :(得分:7)

快速查找标准中的注入类名

  

§11.1[class.access.spec]

     

5 / [注意:在派生类中,基类名称的查找将找到inject-class-name而不是基类的名称在宣布它的范围内。 inject-name的名称可能比声明它的作用域中的基类名称更不易访问。 -end note ]

     

[例如:

class A { };
class B : private A { };
class C : public B {
    A *p; // error: injected-class-name A is inaccessible
    ::A *q; // OK
};
     

-end example]

我相信这与你的榜样非常接近;)


注意clang 3.0的堆栈,稍微更明确一点:

$ clang++ -fsyntax-only test.cpp
test.cpp:6:5: error: 'B' is a private member of 'B'
    B* foo () { return 0; } // error: ‘struct B B::B’ is inaccessible !
    ^
test.cpp:2:12: note: constrained by private inheritance here
struct D : private B {
           ^~~~~~~~~
test.cpp:1:8: note: member is declared here
struct B {};
       ^
1 error generated.

我们在此处看到B是通过D访问的,而不是直接在全局命名空间中获取。

答案 2 :(得分:1)

我最好的猜测是它不被禁止,C ++根本没有在该语句中看到B类型,或者更好的是标签B没有任何意义。

关于

的一些好读物