【问题标题】:Why does GCC not allow inheriting from a private nested class when you are a friend?当您是朋友时,为什么 GCC 不允许从私有嵌套类继承?
【发布时间】:2016-09-26 00:53:34
【问题描述】:

同样的问题被问到:为什么 GCC 允许从私有嵌套类继承? 对于非模板类,它允许从私有嵌套类继承, 如果是朋友,但不是模板类。 是bug吗?

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>{};
}

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

error: 'class MyBase::MemberPrivate' is private
     class MemberPrivate{};
           ^
error: within this context
 class InheritFromBaseMember : public Base::MemberPrivate // error
       ^

【问题讨论】:

  • 您确定编译器版本吗?它使用 g++ 4.9.0 及更高版本(包括 5.3.0)编译 here 就好了。但不是早期版本。
  • 嗯,我用 Eclipse/CDT Cygwin Miscellaneous --version 翻译,输出是:g++ (GCC) 5.3.0

标签: c++ templates inheritance nested friend


【解决方案1】:

这绝对是一个 gcc 错误。 gcc 有 lots of issues 与友谊和模板。这个例子几乎完全出现在标准中,在 [class.friend] 下,强调我的:

将一个类声明为友元意味着该类的私有成员和受保护成员的名称 授予友谊可以在 base-specifiers 和 befriended 类的成员声明中访问。
[ 示例:

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
    };
};

——结束示例]

【讨论】:

  • @VinnieFalco 为了什么?
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多