首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问派生类中类的受保护成员

访问派生类中类的受保护成员
EN

Stack Overflow用户
提问于 2009-10-26 20:37:54
回答 2查看 2.5K关注 0票数 9

我这里有一个旧的代码库,他们使用了受保护的成员变量。这是不是一个好主意可以讨论。但是,代码必须使用gcc3编译得很好。我有一个派生模板类Bar,它使用来自类template Foo的受保护成员x,如下所示

代码语言:javascript
复制
template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

在cleanup()的方法声明中,有一些对x的操作

代码语言:javascript
复制
template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

这不适用于gcc4,尽管它本应适用于gcc3。当我将其更改为

代码语言:javascript
复制
doSomeThingCleanUpLike (this->x);

为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-26 21:06:47

根据标准中的规则,派生类中使用的表达式x不依赖于派生类的任何模板参数。因此,查找发生在模板定义的上下文中,而不是在使用/实例化时。即使模板的模板基类看起来是可见的,因为它是一个模板类,所以可能使用的特定实例化可能涉及专门的模板,因此基类模板定义不能用于名称查找。

通过将表达式更改为this->x,可以使其成为依赖表达式(类模板中的this始终依赖于模板参数)。这意味着查找将在实例化上下文中发生,此时基类是完全已知的,并且其成员是可见的。

票数 14
EN

Stack Overflow用户

发布于 2009-10-26 20:56:09

在定义派生模板时,编译器只知道基模板类的名称,而不知道它的详细信息,因此编译器不知道派生类具有继承的成员。为了告诉编译器该成员的存在,使用this->,就像您所做的那样。

实际上,它是this question的复制品。

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

https://stackoverflow.com/questions/1624564

复制
相关文章

相似问题

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