C++ 从子类初始化受保护的静态成员

C++ 从子类初始化受保护的静态成员,c++,static,initialization,C++,Static,Initialization,我想知道是否可以从子类初始化受保护的静态成员。 例如, // head file class Test { protected: static int i; }; class Test2 : public Test{}; //cpp file #include "headfile.h" int Test2::i = 1; 如您所见,当我初始化这个静态成员(I)时,我使用子类名称(Test2)。 令我惊讶的是,我用visual studio 2013测试了这段代码,它运行正常。但是,如

我想知道是否可以从子类初始化受保护的静态成员。
例如,

// head file
class Test
{
protected:
    static int i;
};
class Test2 : public Test{};

//cpp file
#include "headfile.h"
int Test2::i = 1;
如您所见,当我初始化这个静态成员(I)时,我使用子类名称(Test2)。
令我惊讶的是,我用visual studio 2013测试了这段代码,它运行正常。但是,如果我在Linux下使用Netbeans(gcc11)进行尝试,我会得到一个提示错误:
无法解析标识符i

然后我编译了它,错误消息是:
<代码>错误:ISO C++不允许“测试::I”被定义为“Test2::i(-fPrimeExisty] < /Calp>

)。 现在,如果我在类测试中将
静态int I
的protected改为public,错误将消失。


我很困惑。。。这是我第一次发现gcc和vs的两个不同结果。定义违反了C++14[class.static.data]§9.4.2/2。重点地雷:

在命名空间范围的定义中,静态数据的名称 成员应通过使用
接线员


GCC(on)的最新版本的行为与此相同,而与限定符无关。您可以使用
-fppermissive
来消除GCC上的错误,但请注意,您仍然只定义了一个属于基类的对象。

您是如何在visual studio中测试它的?测试/代码是否与您在netbeans中所做的相同?我认为这会出错,因为您试图公开访问一个私有变量。@MarshallTigerus我确信它们是完全相同的代码,因为我复制了它。事实上,我试过保护隐私,但两种都不起作用。只有public有效。在将
i
的访问权限更改为
public
@Thomas之后,Clang仍然不接受它。我引用了该标准的最新版本,但该规则一点也不新。在C++98中,完全相同的单词位于具有相同节号的完全相同的段落中。