dependent name을 사용한 멤버 템플릿 접근 시 template 키워드의 사용

CN said, class, template, typename의 차이는 class, typename의 차이라고 해야 하지 않을까요? 에 대한 답글입니다.

보통 템플릿을 선언할때는

template<class T>
void func(T &x);

또는

template<typename T>
void func(T &x);

와 같이 혼용할 수 있으므로 선택의 기준은 class냐 typename이냐가 될 수 있다는 말씀에 동의합니다.

제가 생각한 내용은 템플릿을 쓸 때, class, typename, template 키워드가 나와야 되는 상황에서 어떻게 이 세가지를 제대로 쓰는지는 어렵다는 점이었습니다. 답글에 이중템플릿이란 용어를 쓰셨는데, 이 용어는 처음 접해봤지만 아마 저와 같은 내용을 지칭하는 것이라 생각됩니다. 답글 감사합니다 (^^)(__)

다음은 제 기억을 위해 – 그리고 이 블로그의 존재 목적을 위해 – template 에 대해 남기는 내용입니다.

template은 dependent name을 사용해 멤버 템플릿을 . 또는 :: 또는 -> 로 접근할 때 씁니다. 예를 들면,

#include <iostream>

using namespace std;

struct foo
{
    template<int U>
    int bar(int x)
    {
        return U * x;
    }
};

template<class T>
struct caller
{
    int bar(T &x)
    {
        return x.template bar<3>(2);  // Note: template is required.
    }
};

int main()
{
    caller<foo> c;
    foo f;
    cout << c.bar(f) << endl;

    return EXIT_SUCCESS;
}
&#91;/code&#93;

과 같이 어떤 타입을 T로 받고 나서 그 T의 템플릿 멤버 함수를 호출하고자 할 경우 필요합니다. 만약 template 구문이 없다면 g++에서는 다음과 같은 에러가 납니다. 앞서의 예가 좀 작위적인데 이해해 주시길.

&#91;code&#93;
test.cpp: In member function 'int caller<T>::bar(T&) [with T = foo]':
test.cpp:27:   instantiated from here
test.cpp:19: error: invalid use of member (did you forget the '&' ?)

이렇게 황당해지는 이유는 x.bar<3>(2) 이라고 적으면 이 구문이 x.bar < 3 과 3 > (2) 로 해석 될 수 있기 때문이고 이것이 C++에서 유효한 문장이기 때문입니다. 설명도 역시 formal 하지는 않은데 역시나 이해해 주시길. 전 formal 한 설명보면 C++이 점점 더 싫어지는고로;;

Similar Posts:

Comments 3