2008.12.15 21:46 책 정리/C++ Template

함수 템플릿의 경우 템플릿 매개변수가 함수의 인자에서 추론 될 수 있음을 알게 되었다. 이 추론 때문에, 함수 오버로딩이란 기능을 이용하기 위해선, 몇가지 규칙을 이해하고 있어야 하는 리스크가 있다.

물론 함수 템플릿을 사용 하는것에 비하면 아무것도 아니지만...우선 코드를 보고, 어느게 호출 될지 생각해 보자.


13, 14, 15 라인에서 어떤 함수가 호출 될 것이라고 생각 하는가?

13 라인에선 맨 위의 함수 템플릿이 호출 된다.

14 라인에선 맨 아래 함수가 호출 된다.

15 라인에선 가운데 템플릿 함수가 호출 된다고 생각 하겠지만, 에러가 난다.


적절한 함수 템플릿을 컴파일러는 어떻게 탐색 하는가?

  1. 함수 템플릿 특수화를 찾는다.
  2. 1 에서 없다면, 함수 템플릿에서 후보로 몇가지를 만들어 낸다.
  3. 2번에서 만들어진 함수 템플릿 중 가장 가까운 특수화 코드를 선택한다.
  4. 3번에서 선택한 함수 템플릿과 일반함수가 동시에 있다면, 일반 함수가 호출 되어진다.
  5. 4번에서 일반 함수가 없다면 3번에서 선택한 삼수템플릿이 호출 되어 진다.

이 탐색 과정 중 인자의 승격, 표준변환, 사용자 변환 과정은 적용 되지 않는다. 단지 찾아서 어떤것을 호출 할지 정하고, 정해지면 인자의 승격 또는 표준변환, 사용자 변환 과정이 정해 진다.

이때 찾아 진다는 것은 단 1개의 함수만을 찾는 다는 것을 의미한다. 만약 두개 이상 찾아 지거나 아무것도 찾을수 없다면, .. 컴파일 에러가 나게 된다.(링커 에러는 함수가 다 보이는데 함수의 본체를 모를 경우이다)


여기서 한가지 더, 예제코드에서 15 라인이 안되는 이유는, ... std::sqrt 가 f 함수 내부에서 보이기 때문이다. 이것은 이름 검색 규칙에 의해서, 매개변수로 전달된 변수의 네임스페이스까지 끌고 왔기 때문이다.


이것이 함수 템플릿의 중요한 점이다.


posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요