我有以下代码:
#include <iostream>
class BaseClass {
protected:
static int x;
};
int BaseClass::x;
class DerivedA: public BaseClass {
public:
DerivedA() {
x = 3;
}
};
class DerivedB: public BaseClass {
public:
DerivedB() {
std::cout << DerivedA::x;
}
};
int main(int argc, char* argv[]) {
DerivedB b;
}
使用g ++(g++ classtest.cpp
)进行编译时收到以下错误:
classtest.cpp:在构造函数'DerivedB :: DerivedB()'中:
classtest.cpp:9:5:错误:'int BaseClass :: x'受保护
int BaseClass :: x;
^ classtest.cpp:25:32:错误:在此上下文中 std :: cout&lt;&lt; DerivedA :: X;
当我使用clang ++(clang++ classtest.cpp
)进行编译时,没有错误。
为什么g ++会返回编译错误?
我使用g ++版本5.1.0和clang ++版本3.6.1
答案 0 :(得分:17)
GCC错误。 [class.access.base] / P5:
m
成员R
可在课程N
中点击m
N
作为m
的成员是公开的,或N
作为R
的成员是私有的,N
出现在班级m
的成员或朋友中,或N
作为R
的成员受到保护,N
出现在班级P
的成员或朋友中,或出现在班级成员{{1}中来自N
的,m
作为P
成员的公开,私有或受保护,或B
存在N
的基类R
,可在m
访问R
,B
可在课程{{1}中命名}}。
N
是DerivedA
,m
是x
,R
是DerivedB
的构造函数。存在BaseClass
的基类DerivedA
,可在R
访问,x
在类BaseClass
中命名(即BaseClass::x
)是在R
处可以清楚地访问,因此在第四个项目符号点DerivedA::x
可以访问R
。