Introduction

이번 3부에선 템플릿 파싱 규칙에 대해서 정리하고 있다. 여기서 typename과 template 들을 사용 하는 방법과 using 사용시 주의 해야 할점, ADL로 인식 안되는 경우 등을 살펴 보고 있다. MSVC에선 일반적으로 간편하게 되는 경우가 있으나, 다른 컴파일러를 사용해야 한다면, 어느정도는 알고 있어야 된다.


Content

C++ 컴파일러가 C++을 파싱하는 방법

을 책에선 설명하는데, 좀 많이 생략되어서 인터넷으로 한글로 검색하다 나오지 않아 짦은 영어로 검색했다. 그리고 "dragon book"에 잘 나와 있다고 되어 있어서 검색해 보니 "http://en.wikipedia.org/wiki/index.html?curid=188976"이 있었다. 국내 번역서를 찾아 보니 "http://kangcom.com/sub/view.asp?sku=200904060003" 이 있었다.

원론적인 책으로 생각 되는데, 조금이라도 도움이 될것 같지만, 선뜻 구매가 어렵다.(누가 빌려줘...)

C++ 컴파일 원리를 몇 줄로 정리 하자면, 기호 테이블이 있는데, 이곳에 각 기호를 파싱하여 넣어 두었다가, 참조하면서 문맥을 해석 된다.
 어떻게 기호 테이블을 참조하고, 삽입하는지?, 어떤 형태로 기호 테이블이 이루어졌는지?, 문맥을 어떻게 이해 하는지? 에 대해서는 나와있지 않으므로, 더 이상 정리는 하지 않는다. 더 알고자 한다면 "드래곤 북(DirectX 용책과 햇갈리겠다)"을 봐야 할 것 같다.


이처럼 C++ 파싱이 어렵다. 여기에 템플릿 까지 파싱하려니, 더 어렵다. 그래서 템플릿 파싱이 잘 되지 않는다. 이는 템플릿 코드 안에서 다른 템플릿 코드를 분석할 수 없기 때문인데, 이때 typename 을 사용하여, 컴파일러가 파싱하는것을 거들어 주어야 한다.

1. typename을 언제 어떻게 사용 하는가?

1. 템플릿 안에서 다른 템플릿속에서 정의된 타입을 선언할 때 쓴다.


2. 클래스 템플릿이 클래스 템플릿 속에 있는 클래스를 상속했을 경우, 생성자에서 그 템플릿 클래스 속에 있는 클래스 생성자를 호출하고 싶을 경우에 쓴다.(말이 어려우니 그냥 코드로 보자. 여담으로 종이와 연필로 그려보지 않고, 말을 이해 하는건 뇌의 연산 낭비라고 나는 생각하게 되었다.)



위의 경우와 유사하게 template 키워드가 필요할 경우도 있다.

2. template를 언제 어떻게 사용 하는가?

1. 클래스 템플릿 속의 클래스 템플릿의 멤버 함수가 가상 함수일 때, 가상함수 호출을 억제하고자 할 경우이다.(이건 어렵다. 코드 자체가 어렵다. 이것을 이해 했고, 사용 할 수 있다면, 컴파일러 제작자로써 살아도 괜찮다고 까지 나는 생각 한다.)


다행인 것은 MSVC에선 조금 쉽게 된다는 것이고, 불행인 것은 이것이 어렵다는 것이다. 어려우면 나는 이해하지 못하고, 기억 할 수 없다. 그래도 나는 천천히 나아간다.


파싱을 하는데, using을 빼 놓을 수는 없다. 왜냐하면 using으로 다른 영역의 이름을 끌고 올 수 있기 때문이다. 하지만 using 선언시 몇가지 주의 사항이 있다.

3. using 선언에서 주의 해야 할 점

파생 클래스에서 기반 클래스의 이름을 가져오고조 할 때, private이 영향을 받지 않는다. 이는 기본적인 사항이니 이 정도만 지적하고 넘어가기로 한다. 우리가 주의해야 할 것은 클래스 템플릿일 때, 기반 클래스 템플릿 속에 있는 이름들을 using으로 가져 와도, 템플릿은 가져 올 수 없다는 것이다.



마지막으로 많이 잘못된 생각을 하는 것을 지적을 한다.

4. ADL로 평가 되지 못 하는 경우


여기서 select를 찾을 수 있을 것이라고 나는 생각했었다. 책의 설명으로 ADL로 인자를 추론하기도 전에 "select<" 을 평가하기 때문에, 함수 템플릿이라고 인정 되지 않고, select < int .. 이런식으로 평가가 된다고 한다.


Digression

다른건 몰라도 typename 은 많이 쓰이니 꼭 알고 넘어가야 한다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기