使用私有继承的限定名称的行为

Bet*_*tin 9 c++ inheritance

在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)

Ideone

T.C*_*.C. 5

注射级-名.

该名称Interface被注入到类的范围中,Interface就像它是一个公共成员一样,然后由Base<Interface>(作为私有成员,因为您使用私有继承)继承.

当你写入Base<Interface>::foo()Derived,Interface首先查看的非限定名称查找Derived及其基类,Interface在基类中找到,然后访问控制启动,因为该名称是private.

最简单的解决方法是只写Base::foo(),甚至只是foo()如果它不是虚拟的,你不打算写foo()Derived.

如果由于某种原因必须包含模板参数,那么写Base<::Interface>.