(나는 몇 가지 실수를 고정).
첫 번째 단계에서 모든 종속되지 않는 이름이 확인됩니다. 두 번째 단계에서는 종속 이름이 확인됩니다.
종속 이름
지금, 당신이 쓰는 템플릿 매개 변수에 따라 이름, 예컨대 :
template <typename T>
void foo() {
x = 0; // <- Non-dependent, nothing in that refers to "T".
// Thus looked up in phase 1, therefore, an 'x' must be
// visible.
T::x = 0; // <- Dependent, because it depends on "T".
// Looked up in phase 2, which is when it must be visible.
}
입니다 :
t = this->a; //Okay
t = a //Error
이 내가 설명 정확히 것입니다. 괜찮은 용어 인 경우 t
은 2 단계에서 으로 조회됩니다. this
은 템플릿 매개 변수에 따라 달라지기 때문입니다.
해당 이름의 아무 것도 템플릿 매개 변수에 의존하지 않으므로 잘못된 용어는 1 단계에서 조회됩니다. 템플릿을 특수화 할 수 있고 기본 템플릿 선언에서 원격 일 수있는 , 다른 전문화 인 은 템플릿이 특수화 될 수 있기 때문에 컴파일러에서 기본 클래스 템플릿 을 인트로 스콥 할 수 없으므로 1 단계에서 컴파일러가 a
을 볼 수 없습니다. a
이 표시되지 않을 수 있습니다.
예 :
template <typename T>
struct Base {
};
template <typename T>
struct Derived : Base<T> {
void foo() {
this->a = 0; // As is valid. `this->a` is looked up in phase 2.
}
};
template <> struct Base<int> {
int a;
};
int main()
{
// The following declarations trigger phase 2 lookup.
Derived<int> di; // valid, because a later specialized
// Base<int> is used and all symbols
// are resolved.
Derived<float> df; // not valid
}
, BTW 내가 한 번 내 매우 낮은 주파수 블로그에 this-> is not only a matter of style를 작성했습니다.
요아킴 말보로가 대답을주었습니다. 그 외에도, 제공된 코드에는 컴파일하는 것을 방해하는 다른 문제가 있습니다. – Anonymous
이것이 실제 코드입니까?'int B에 대한 클래스 정의와 스코프 연산자 뒤에는 뒤에 오는 세미콜론이 없습니다 : f()'는 오류 라인에 세미콜론을 더한 것이 아니라 부정확합니다. –
hmjd
오, 그냥 타이핑 실수 일뿐입니다. 나는 그것을 고쳤다. –