[C++] template의 두 가지 의미

less than 1 minute read

어디서 많이 본것같은 제목이라고 느꼈다면, 아마 당신은 최근에 Effective C++를 읽은 사람일 것이다. 항목 42의 제목이 “typename의 두 가지 의미를 제대로 파악하자”이기 때문이다. 의존 이름에 관한 내용인데, 혹시 모른다면 검색해서 알아보기 바란다.

오늘 얘기하고자 하는 것은 template에도 두 가지 의미가 있다는 것이다. 자, 다음 코드를 보자.

template <class T>
struct A
{
    template <int N>
    static void f(int a) {}
};

template<>
struct A<int>
{
    static constexpr auto f = 2;
};

template <class T>
void f()
{
    A<T>::f<3>(2);
}

함수 f()에 템플릿 인자로 int 외의 타입을 전달하면 A<T>::f<3>(2)는 함수 호출로 해석될 것이다.

그러나 int가 전달되면 완전히 다르다. A<T>::f<3>(2)f3을 비교하고 그 결과를 또 2랑 비교하는 문장이 된다. 즉, (A<T>::f < 3 > 2)(2 < 3 > 2)(true > 2)(false) 가 되는 것이다.

이를 해결하려면 template 키워드를 사용하면 된다.

A<T>::template f<3>(2);

이처럼 중첩 의존 이름이 템플릿 인자를 받도록 하려는 경우, 이름 바로 앞에 template을 붙여준다.

이해를 돕기 위해 typenametemplate가 동시에 쓰이는 경우를 보이며 마치겠다.

template <typename T>
struct A
{
    template <typename T>
    struct B {};
};

template <class T>
void f()
{
    typename A<T>::template B<T> a;
}

Categories:

Updated:

Comments