더북(TheBook)

컴파일러가 my_swap() 호출을 만났을 때 컴파일러는 호출에 있는 인수를 토대로 함수 템플릿의 인스턴스를 생성한다. 여기서 생성되는 템플릿 타입의 반복자는 iterator<std::string>일 것이다. my_swap() 템플릿의 본체에서 컴파일러는 tmp에 대한 정의를 처리해야 한다. 컴파일러는 my_swap() 템플릿의 타입 인수가 iterator<std::string>이라는 사실을 알고 있으므로 타입 인수를 템플릿 안에 넣을 것이고 tmp에 대한 정의는 다음과 같을 것이다.

typename std::iterator_traits< iterator<std::string> >::value_type tmp = *a;

이제 tmp의 타입은 iterator_traits 템플릿 인스턴스의 멤버가 되었다. 이게 실제로 무슨 뜻인지 이해하려면 컴파일러가 my_swap() 함수에서 tmp에 대한 타입 지정에 나타난 타입 인수를 사용해 iterator_traits 템플릿을 인스턴스화해야 한다. 여기 컴파일러가 생성했을 iterator_traits 템플릿의 인스턴스를 보자.

struct iterator_traits
{
typedef typename iterator<std::string>::difference_type   difference_type;
typedef typename iterator<std::string>::value_type        value_type;
typedef typename iterator<std::string>::pointer           pointer;
typedef typename iterator<std::string>::reference         reference;
typedef typename iterator<std::string>::iterator_category iterator_category;
};

이 인스턴스에서 컴파일러는 tmp의 타입을 결정해야 한다. tmpiterator_traits<iterator<std::string>>::value_type이고, 이 타입은 또 다른 별칭이다. 즉, iterator<std::string>::value_type에 대한 별칭이다. 모든 STL 반복자 타입과 마찬가지로 반복자 템플릿에서 생성된 iterator<std::string> 타입 정의에는 value_type에 대한 정의가 포함된다. value_type 정의는 다음과 같을 것이다.

typedef std::string value_type;
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.