首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从子类初始化受保护的静态成员。

从子类初始化受保护的静态成员。
EN

Stack Overflow用户
提问于 2015-04-22 13:53:57
回答 1查看 953关注 0票数 4

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

例如,

代码语言:javascript
复制
// 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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 14:10:48

该定义违反了C++14 class.static.data§9.4.2/2。

在名称空间范围的定义中,静态数据成员的名称将由(其类名)使用::运算符限定。

GCC的最新版本(在柯尔鲁上)无论是哪个限定符都是一样的。您可以使用-fpermissive克服GCC的错误,但请注意,您仍然只定义一个属于基类的对象。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29799766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档