我想知道是否可以从子类初始化受保护的静态成员。
例如,
// 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),并得到一个提示错误:
unable to resolve the identifier i
然后我编译了它,错误消息是:
error: ISO C++ does not permit ‘Test::i’ to be defined as ‘Test2::i’ [-fpermissive]
现在,如果我在类测试中将受保护的static int i更改为公共的话,错误就会消失。
我很困惑..。这是我第一次发现gcc和V.
发布于 2015-04-22 14:10:48
该定义违反了C++14 class.static.data§9.4.2/2。
在名称空间范围的定义中,静态数据成员的名称将由(其类名)使用
::运算符限定。
GCC的最新版本(在柯尔鲁上)无论是哪个限定符都是一样的。您可以使用-fpermissive克服GCC的错误,但请注意,您仍然只定义一个属于基类的对象。
https://stackoverflow.com/questions/29799766
复制相似问题