【发布时间】:2015-10-02 01:51:45
【问题描述】:
我有以下代码:
#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:在构造函数“DeriveddB::DeriveddB()”中:
classtest.cpp:9:5: 错误:‘int BaseClass::x’受保护
int BaseClass::x;
^ classtest.cpp:25:32: 错误:在此上下文中
std::cout
当我使用 clang++ (clang++ classtest.cpp) 编译时没有错误。
为什么 g++ 返回编译错误?
我使用 g++ 5.1.0 版和 clang++ 3.6.1 版
【问题讨论】:
-
它也在MVS2015中编译
-
令我更惊讶的是,clang 没有抛出错误......但我可以确认,它不是。
-
@DrewDormann 为什么?我对这个错误感到惊讶:尽管有
DerivedA::,但它实际上是从派生自BaseClass的类访问BaseClass的受保护成员。 -
@TheHumanWall:
x被声明为BaseClass的静态成员。它是而且必须是单独定义的。 -
FWIW,这在 GCC 4.3 中确实有效,但 GCC 4.4 开始为其提供错误消息。
标签: c++ inheritance gcc clang