Gee*_*eeF 9 c++ inheritance gcc protected this
我在这里有一个旧的代码库,他们使用受保护的成员变量.可以讨论这是否是一个好主意.但是,代码必须与gcc3编译良好.我有一个派生模板类Bar,它使用类模板Foo中的受保护成员x
template <class Something> class Foo {
public:
// stuff...
protected:
some::type x;
}
template <class Something> Bar : Foo<Something> {
public:
void cleanup();
}
Run Code Online (Sandbox Code Playgroud)
在cleanup()的方法声明中,有一些用x完成的事情
template <class Something> void Bar<Something>::cleanup() {
doSomeThingCleanUpLike (x);
}
Run Code Online (Sandbox Code Playgroud)
这不适用于gcc4,虽然它应该与gcc3一起使用.当我将其更改为时,它可以工作
doSomeThingCleanUpLike (this->x);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
CB *_*ley 13
根据x标准中的规则,派生类中使用的表达式不依赖于派生类的任何模板参数.因此,查找发生在模板定义的上下文中,而不是在使用/实例化时.即使模板的模板基类看起来是可见的,因为它是模板类,可能使用的特定实例化可能涉及专用模板,因此基类模板定义不能用于名称查找.
通过将表达式更改为this->x您使其成为依赖表达式(this在类模板中始终取决于模板参数).这意味着将在实例化上下文中进行查找,此时基类是完全已知的并且其成员是可见的.