Xeo*_*Xeo 13 c++ templates scope base-class c++11
对此问题的后续问题.
基本上,在下面的代码,为什么编译器还认为,B内部A<B>的C构造函数指的(无法访问)构造函数B的基类?
struct B{};
template <typename T>
struct A : private T{};
struct C : public A<B>{
C(A<B>); // ERROR HERE
};
Run Code Online (Sandbox Code Playgroud)
Ideone上的实例.输出:
prog.cpp:1:9:错误:'struct BB :: B'无法访问
prog.cpp:7:7:错误:在此上下文中
请注意,如果你改变了构造函数参数相同的错误弹出A<B*>,A<B&>甚至A<const B>.另请注意,MSVC10,GCC 4.7和Clang 3.1 ToT中的三个将出错,因此它必须是C++规范中的内容.它是什么?
R. *_*des 15
该标准允许注入的类名比原始名称更难访问.这甚至在§11.1/ 5的注释中提到,并附有一个例子:
[ 注意:在派生类中,基类名称的查找将在声明它的作用域中找到inject-class-name而不是基类的名称.inject-name的名称可能比声明它的作用域中的基类名称更不易访问.- 尾注 ]
[ 例如:
Run Code Online (Sandbox Code Playgroud)class A { }; class B : private A { }; class C : public B { A *p; // error: injected-class-name A is inaccessible ::A *q; // OK };- 结束例子 ]
访问A非限定使用注入的名称,该名称不可访问,因为它来自私有继承.访问A限定使用声明的名称,该名称可在全局范围内访问.