有人可以向我解释以下编译错误:
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
究竟什么是无法进入的?为什么?
答案 0 :(得分:6)
尝试A< ::B>
或A<struct B>
。
在C
内,对B
的非限定引用将获取所谓的注入类名,它通过基类{{1}引入}}。由于A
从A
私下继承,因此注入类名也属于私有,因此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::B
是private
所以您无法构建C
。