在 C++ 中还没有提到一种用途,那就是不引用自己的对象或从接收的变量中消除成员的歧义。
您可以使用this
在从其他模板继承的模板类中将非依赖名称转换为参数依赖名称。
template <typename T>
struct base {
void f() {}
};
template <typename T>
struct derived : public base<T>
{
void test() {
//f(); // [1] error
base<T>::f(); // quite verbose if there is more than one argument, but valid
this->f(); // f is now an argument dependent symbol
}
}
模板是使用两遍机制编译的。在第一轮中,仅解析和检查非参数依赖名称,而仅检查依赖名称的一致性,而不实际替换模板参数。
在这一步,在没有实际替换类型的情况下,编译器几乎没有关于base<T>
可能是什么的信息(请注意,基本模板的特殊化可以将其变成完全不同的类型,甚至是未定义的类型),所以它只是假设它是一个类型. 在这个阶段,对程序员来说似乎很自然的非依赖调用f
是一个符号,编译器必须找到它作为封闭命名空间的成员derived
或封闭命名空间——这在示例中不会发生——它会抱怨。
解决方案是将非依赖名称f
转换为依赖名称。这可以通过几种方式来完成,通过明确说明实现它的类型(base<T>::f
--addingbase<T>
使符号依赖,T
编译器将假设它存在并推迟第二遍的实际检查,之后参数替换。
第二种方法,如果您从具有多个参数或长名称的模板继承,则更多排序器只是this->
在符号前添加一个。由于您正在实现的模板类确实依赖于一个参数(它继承自base<T>
)this->
是依赖于参数的,我们得到相同的结果:this->f
在模板参数替换之后的第二轮检查。