g ++编译错误" ...在此上下文中受到保护"虽然铿锵没有错误

时间:2015-07-13 17:12:40

标签: c++ inheritance gcc clang

我有以下代码:

#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

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访问RB可在课程{{1}中命名}}。
  •   

NDerivedAmxRDerivedB的构造函数。存在BaseClass的基类DerivedA,可在R访问,x在类BaseClass中命名(即BaseClass::x)是在R处可以清楚地访问,因此在第四个项目符号点DerivedA::x可以访问R