涉及私有继承的C ++编译器错误

时间:2012-02-10 05:28:00

标签: c++ templates inheritance compiler-errors private-inheritance

有人可以向我解释以下编译错误:

struct B
{
};

template <typename T>
struct A : private T
{
};

struct C : public A<B>            
{                                                                             
    C(A<B>);   // ERROR HERE
};

指示行的错误是:

test.cpp:2:1: error: 'struct B B::B' is inaccessible
test.cpp:12:7: error: within this context

究竟什么是无法进入的?为什么?

3 个答案:

答案 0 :(得分:6)

尝试A< ::B>A<struct B>

C内,对B的非限定引用将获取所谓的注入类名,它通过基类{{1}引入}}。由于AA私下继承,因此注入类名也属于私有,因此B无法访问。

另一天,另一种语言怪癖......

答案 1 :(得分:4)

问题是结构B的名称屏蔽。 看看:

struct B{};

struct X{};

template <class T>
struct A : private T
{};

struct C : public A<B>
{
    C(){
          A<X> t1;     // WORKS
 //       A<B> t2;     // WRONG
          A< ::B> t3;  // WORKS
    }   
};

int main () {
}

答案 2 :(得分:-1)

当您执行A时,您private B继承A<B>,这意味着B::Bprivate所以您无法构建C