C++ 在模板化的派生类中,为什么我需要用“";这->&引用;在成员函数中?

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

当我研究Qt的源代码时,我看到trolltech的人明确地使用
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
    }
};