dependent_name — 종속 이름

dependent_name — 종속 이름 (Dependent names)

**종속 이름(dependent name)**은 템플릿 정의 안에서 인스턴스화에 따라 의미가 달라질 수 있는 이름이에요.

템플릿(클래스 템플릿과 함수 템플릿 모두)을 정의할 때, 어떤 구문의 의미는 인스턴스화마다 달라질 수 있어요. 특히 타입과 표현식이 타입 템플릿 매개변수의 타입이나 비타입 템플릿 매개변수의 값에 의존할 수 있어요. 종속 이름과 비종속 이름은 이름 조회(lookup)와 바인딩 방식이 달라요.

출처: cppreference

본문

바인딩 규칙 (Binding rules)

**비종속 이름(non-dependent name)**은 템플릿 정의 시점에 조회되고 바인딩돼요. 이 바인딩은 인스턴화 시점에 더 나은 매치가 있어도 유지돼요.

#include <iostream>

void g(double) { std::cout << "g(double)\n"; }

template<class T>
struct S
{
    void f() const
    {
        g(1); // "g"는 비종속 이름, 지금 바인딩됨
    }
};

void g(int) { std::cout << "g(int)\n"; }

int main()
{
    g(1);  // g(int) 호출

    S<int> s;
    s.f(); // g(double) 호출
}

비종속 이름의 의미가 정의 문맥과 인스턴스화 문맥 사이에서 바뀌면 그 동작은 정의되지 않아요(undefined).

반면 종속 이름은 인스턴스화 시점에 조회되고 바인딩돼요. 종속 타입 이름을 쓸 때는 typename 키워드를, 종속 템플릿 이름을 쓸 때는 template 키워드를 사용해야 하는 기준이 있어요.

template<class T>
void f() {
    typename T::iterator it;  // 종속 타입 이름 → typename 필요
    T::template make<int> x;  // 종속 템플릿 이름 → template 필요
}

**두 단계 조회(two-phase lookup)**라고 불리는 이 구조는 템플릿 정의 시점과 인스턴스화 시점의 조회를 구분해요. 이를 정확히 이해하면 템플릿 코드에서 "왜 이 이름을 못 찾지?" 같은 혼란을 줄일 수 있어요.

더 알아보기 (Learn more)

cppreference