当你是朋友时,为什么GCC不允许继承私有嵌套类?

ger*_*rdi 9 c++ inheritance templates nested friend

同样的问题:为什么GCC允许从私有嵌套类继承?对于非模板类,如果它是朋友,则允许从私有嵌套类继承,但不允许从模板类继承.这是一个错误吗?

template<class Base>
class InheritFromBaseMember : public Base::MemberPrivate // error
{
    using PrivateMember = typename Base::MemberPrivate; // works fine
};

class MyBase{
    friend class InheritFromBaseMember<MyBase>;

    // another try to declare it friend
    template<class T>
    friend class InheritFromBaseMember;

    friend class AnotherClass;

    class MemberPrivate{};
};

class AnotherClass : public MyBase::MemberPrivate{}; // works fine

int main() {
    InheritFromBaseMember<MyBase>{};
}
Run Code Online (Sandbox Code Playgroud)

来自g ++ 5.3.0的错误消息:

error: 'class MyBase::MemberPrivate' is private
     class MemberPrivate{};
           ^
error: within this context
 class InheritFromBaseMember : public Base::MemberPrivate // error
       ^
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 6

这绝对是一个gcc bug.gcc在友谊和模板方面存在很多问题.这个例子几乎完全出现在标准的[class.friend]下,强调我的:

将类声明为朋友意味着可以在友好类基本说明符和成员声明中访问授予友谊的类中的私有成员和受保护成员的名称.
[例如:

class A {
class B { };
    friend class X;
};

struct X : A::B { // OK: A::B accessible to friend
    A::B mx;      // OK: A::B accessible to member of friend
    class Y {
        A::B my;  // OK: A::B accessible to nested member of friend
    };
};
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]