[英]Use protected static function of the base class from the friend of the derived class
不同的編譯器對這個問題似乎有不同的看法。 以下代碼使用gcc
正常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.
這是CWG問題1873 ,它更改了此情況的規則([class.access.base] / p5):
如果在類
N
命名,則成員m
在點R
處可訪問。
- [...]
- 作為
N
的成員的m
受保護,並且R
出現在N
類的成員或朋友中,或發生在從N
派生的P
類的成員或朋友中,其中m
作為P
的成員是公共的,私有的或受保護的,要么- [...]
在這里, N
是Base
, P
是Derived
, m
是f()
,並且R
出現在DerivedFriend
的成員中; 在CWG1873之前,這是允許的,但是CWG1873刪除了“派生類的朋友”案例,並使該案例格式不正確。
解決方法是將f
稱為Derived
的成員,而不是Base
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.