C++ 在模板化的派生类中,为什么我需要用“";这->&引用;在成员函数中?
当我研究Qt的源代码时,我看到trolltech的人明确地使用C++ 在模板化的派生类中,为什么我需要用“";这->&引用;在成员函数中?,c++,qt,templates,this,name-lookup,C++,Qt,Templates,This,Name Lookup,当我研究Qt的源代码时,我看到trolltech的人明确地使用this关键字来访问析构函数上的字段 inline ~QScopedPointer() { T *oldD = this->d; Cleanup::cleanup(oldD); this->d = 0; } 那么,这种用法有什么意义呢?有什么好处吗 编辑:对于那些投票赞成结束这个问题的人,我怀疑这种用法适用于某些类继承情况 定义的一部分: template <typename T, type
this
关键字来访问析构函数上的字段
inline ~QScopedPointer()
{
T *oldD = this->d;
Cleanup::cleanup(oldD);
this->d = 0;
}
那么,这种用法有什么意义呢?有什么好处吗
编辑:对于那些投票赞成结束这个问题的人,我怀疑这种用法适用于某些类继承情况
定义的一部分:
template <typename T, typename Cleanup = QScopedPointerDeleter<T> >
class QScopedPointer
模板
类映射指针
C++答案(一般答案)
考虑一个带有模板基类的模板类派生的:
template <typename T>
class Base {
public:
int d;
};
template <typename T>
class Derived : public Base<T> {
void f () {
this->d = 0;
}
};
Qanswer(具体答案)
d
是一个。它不是继承的成员<代码>此->
在此处不是必需的
奥托
很容易看出,把这个->
放在任何地方都比较容易
了解原因
我想,对于所有C++用户来说,为什么名字在非依赖基类中查找,而不是在依赖基类中:
class Base0 {
public:
int nd;
};
template <typename T>
class Derived2 :
public Base0, // non-dependent base
public Base<T> { // dependent base
void f () {
nd; // Base0::b
d; // lookup of "d" finds nothing
f (this); // lookup of "f" finds nothing
// will find "f" later
}
};
它看起来像是一个完整类型的定义
实际上,在实例化之前,它看起来更像:
template <typename T>
class Base;
实际上是一个基类规范模板(一个制作基类规范的工厂),它遵循与模板中基类规范不同的规则
备注:
读者可能已经注意到,我在解释的最后编了几个短语
这是非常不同的:这里d
是Derived
中的限定名,Derived
是依赖的,因为T
是一个模板参数。即使不是(被调用的)函数名,限定名也可以后期绑定
另一个解决办法是:
template <typename T>
class Derived : public Base<T> {
void f () {
Derived::d = 0; // qualified name
}
};
模板
派生类:公共基{
空f(){
派生::d=0;//限定名
}
};
这是等价的
如果您认为在Derived
的定义中,有时将Derived
视为一个已知的完整类,有时将其视为一个未知类,那么您是对的。我想这与Cleanup()例程的重载使用有关。传递的类型由模板类型T显式控制,而模板类型T又可以控制调用哪个重载版本的Cleanup()。主持人注意:此答案下的注释已被清除,因为它们已退化为纯噪声。请使用扩展讨论,并记住保持礼貌。
class Base0 {
public:
int nd;
};
template <typename T>
class Derived2 :
public Base0, // non-dependent base
public Base<T> { // dependent base
void f () {
nd; // Base0::b
d; // lookup of "d" finds nothing
f (this); // lookup of "f" finds nothing
// will find "f" later
}
};
template <typename T>
class Base {
public:
int d;
};
template <typename T>
class Base;
template <typename T>
class Derived : public Base<T>
template <typename T>
class Derived : public Base<T> {
void f () {
Derived::d = 0; // qualified name
}
};