使用派生类的朋友的基类的受保护静态函数

时间:2015-06-03 16:58:55

标签: c++ clang

不同的编译器似乎对此主题有不同的看法。以下代码使用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.

1 个答案:

答案 0 :(得分:2)

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

  

m成员R可在课程N中点击m

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

此处BasePDerivedmf()RDerivedFriend出现在f的成员;在CWG1873之前,这是允许的,但CWG1873删除了派生类"的朋友。案件并使其形成不良。

此修复方法是将Derived称为Base的成员,而不是{{1}}。