c++ - 访问派生类中类的 protected 成员

标签 c++ inheritance gcc this protected

我这里有一个旧代码库,他们在其中使用了 protected 成员变量。可以讨论这是否是一个好主意。但是,代码必须使用 gcc3 编译得很好。 我有一个派生模板类 Bar,它像这样使用类模板 Foo 中的 protected 成员 x

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

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

在 cleanup() 的方法声明中有一些用 x 完成的事情

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

这不适用于 gcc4,尽管它应该适用于 gcc3。当我把它改成

doSomeThingCleanUpLike (this->x);

为什么会这样?

最佳答案

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

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

关于c++ - 访问派生类中类的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1624564/

相关文章:

编译 libxml2 得到 "error: storage size of ‘hints’ 未知”

c++ - 链接到特定的 stdc++ 库

C++ 创建两个具有重叠内存的变量

c++ - 使用 CMake 静态链接到项目外部的库

c++ - Linux API(如 MSDN)的引用?

c++ - 如何摆脱派生类中的重复代码?

java - 协方差在这里安全吗?

c++ - 为什么我应该按值返回一些东西,因为 C++ 具有 const 引用?

C# 创建具有自定义属性的基本表单

c - 强制调用 libgcc