【问题标题】:Use protected static function of the base class from the friend of the derived class从派生类的朋友那里使用基类的受保护静态函数
【发布时间】:2015-08-18 00:41:17
【问题描述】:

不同的编译器似乎对这个问题有不同的看法。以下代码使用gcc 编译良好,但使用clang 编译失败:

class Base {
protected:
    static void f() {}
};

class Derived : public Base {
    friend class DerivedFriend;
};

class DerivedFriend {
public:
    void g() {
        Base::f();
    }
};

clang的错误是:

main.cpp:13:15: error: 'f' is a protected member of 'Base'
        Base::f();
              ^
main.cpp:3:17: note: declared protected here
    static void f() {}
                ^
1 error generated.

【问题讨论】:

  • @BlakeMcConnell 我不这么认为。在您所指的问题中,“朋友箭头”具有不同的方向:类层次结构是单个类的朋友。
  • 同意,但是看看这个:stackoverflow.com/questions/9878723/…
  • @BlakeMcConnell 是的,这看起来很相似,但如果我在发布我的问题之前找到这个问题,我们不会看到 T.C. 的详尽答案:)
  • @BlakeMcConnell 那是针对非静态成员的,有一个额外的规则。

标签: c++ clang


【解决方案1】:

这是CWG issue 1873,它改变了这个案例的规则([class.access.base]/p5):

当在类N if 中命名时,可以在R 点访问成员m

  • [...]
  • m 作为 N 的成员受到保护,R 出现在 N 类的成员或朋友中,或在成员的或朋友中一个类P 派生的 来自N,其中m 作为P 的成员是公共的、私有的或受保护的, 或
  • [...]

这里,NBasePDerivedmf()R 出现在 DerivedFriend 的成员中;在 CWG1873 之前,这是允许的,但 CWG1873 删除了“派生类之友”的情况并使其格式错误。

解决方法是将f 称为Derived 的成员,而不是Base

【讨论】:

  • @anxieux 这是 Clang 开发人员报告的,所以我并不感到惊讶。
猜你喜欢
  • 2015-08-26
  • 1970-01-01
  • 2023-03-07
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
相关资源
最近更新 更多