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; } [/code] 과 같이 어떤 타입을 T로 받고 나서 그 T의 템플릿 멤버 함수를 호출하고자 할 경우 필요합니다. 만약 template 구문이 없다면 g++에서는 다음과 같은 에러가 납니다. 앞서의 예가 좀 작위적인데 이해해 주시길. [code] 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++이 점점 더 싫어지는고로;;