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
(가) --adding base<T>
의 기호에 의존하게 T
컴파일러는 그냥 존재한다고 가정 할 것이다 연기합니다 후 두 번째 패스에 대한 실제 검사, 인수 대체.
두 번째 방법은 하나 이상의 인수 또는 긴 이름을 가진 템플릿에서 상속하는 경우 분류기 this->
앞에 기호를 추가하는 것입니다. 구현하는 템플릿 클래스 가 인수에 종속 되므로 (에서 상 속됨 base<T>
) this->
인수에 종속적이며 동일한 결과를 얻습니다 this->f
. 템플릿 매개 변수 대체 후 두 번째 라운드에서 확인됩니다.
this
. 이 링크를 따르십시오 ... ;-)