在msvc中编译以下示例时,我得到了
'Interface'无法访问,因为'Base'使用'private'继承'Interface'
在标有的行中Error.当调用foo使用相同类型的类型别名限定时,它可以工作.我用msvc和ideone测试过.
为什么这两个电话不相等?
struct Interface {};
template<class T>
struct Base : private T
{
void foo() {}
};
using BaseX = Base<Interface>;
class Derived : Base<Interface>
{
Derived() {
Base<Interface>::foo(); // Error
BaseX::foo(); // Works
}
};
Run Code Online (Sandbox Code Playgroud)
注射级-名.
该名称Interface被注入到类的范围中,Interface就像它是一个公共成员一样,然后由Base<Interface>(作为私有成员,因为您使用私有继承)继承.
当你写入Base<Interface>::foo()时Derived,Interface首先查看的非限定名称查找Derived及其基类,Interface在基类中找到,然后访问控制启动,因为该名称是private.
最简单的解决方法是只写Base::foo(),甚至只是foo()如果它不是虚拟的,你不打算写foo()在Derived.
如果由于某种原因必须包含模板参数,那么写Base<::Interface>.