我这里有一个旧的代码库,他们使用受保护的成员变量。可以讨论这是否是一个好主意。但是,代码必须与gcc3编译良好。 我有一个派生模板类Bar,它使用来自类模板Foo的受保护成员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);
为什么会这样?
答案 0 :(得分:13)
根据标准中的规则,派生类中使用的表达式x
不依赖于派生类的任何模板参数。因此,查找发生在模板定义的上下文中,而不是在使用/实例化时。即使模板的模板基类看起来是可见的,因为它是一个模板类,可能使用的特定实例可能涉及专用模板,因此基类模板定义不能用于名称查找。
通过将表达式更改为this->x
,您将其作为依赖表达式(类模板中的this
始终取决于模板参数)。这意味着查找将在实例化上下文中进行,此时基类完全已知且其成员可见。
答案 1 :(得分:6)
当您定义派生模板时,编译器只知道基本模板类的名称而不知道其详细信息,因此编译器不知道派生类具有继承成员。为了告诉编译器成员的存在,使用this->
,就像你一样。
实际上,它与this question重复。