2009.07.25 20:50 책 정리/C++ Template

8.2에선 템플릿 파라미터의 종류와 예외적 상황에 대해서 설명하고 있다.

템플릿 파라미터로는 다음 3가지가 올 수 있다.
1. 데이터형 파라미터
2. 데이터형이 아닌 파라미터
3. 템플릿 템플릿 파라미터

각 종류의 예외적 상황을 알아 보자.

8.2.1 데이터형 파라미터의 예외적 사항
데이터형 파라미터 T가 있다면 마치 typedef T 와 동일하게 컴파일러는 인식한다. 그래서 다음 코드는 에러가 날 것이다.

컴파일러 에러를 통해 어떻게 에러가 났는지 알아 보자.

g++43

g++은 템플릿 타입 파라미터 후에 class를 사용했다고 에러를 냈다. 또한 friend 정의 역시 클래스 이름이나 함수가 아니라고 에러를 냈다.

msvc9

msvc9 에서는 좀 이해가 안된다. 뭐가 클래스가 아니라는 거지...

여담으로 위와 같은 프렌드(friend)선언은 앞으로 될 수도 있다고 한다. 그 앞으로가 지금인데, msvc9에선 클래스 템플릿에도 일반 클래스를 friend 로 선언 될 수 있고, g++에선 되지 않는다. 으헝, 뭐 이래.. 최신의 g++을 을 다운받아 해볼까..


8.2.2. 테이터형이 아닌 파라미터의 예외적 사항
데이터형이 아닌 파라미터로는 다음과 같은 것들이 올 수 있다.
1. 상수형이나 열거형
2. 포인터형
3. 참조자형

데이터형이 아닌 파라미터에 typename 이 붙을 수가 있는데, 다음과 같다.

예외적으로 데이터형이 아닌 파라미터에는 static 키워드와 mutable 키워드가 붙을 수가 없다. const, volatile 같은 한정자는
가질 수 있지만, 한정자가 파라미터형의 맨 뒤에 있다면 무시된다. 다음처럼



8.2.3 템플릿 템플릿 파라미터의 예외적 사항
템플릿 템플릿 파라미터는 그 파라미터의 선언을 typename, struct union 이 올 수 없고 무조건 class만 와야 한다. 또한 템플릿 템플릿 파라미터에서 쓰인 템플릿 파라미터는 자신의 기반 템플릿에서 쓰일 수 없다.

다음 코드를 보자.

컴파일 해보면 잘 알 것이다. g++ 역시 템플릿 템플릿 파라미터를 잘 지원해 준다.
다음 코드는 템플릿 템플릿 파라미터에 쓰인 템플릿 파라미터는 쓰일 수 없는 것을 보여 준다.



8.2.4 디폴트 템플릿 인자란 무엇일까?
함수의 디폴트 매개변수 처럼 템플릿 파라미터 역시 갖을 수 있는데, 현재는 클래스 템플릿만 지원된다. 일반적으로 첫번째 템플릿 파라미터는 기본인자를 주지 않고, 그 뒤에 나오는 템플릿 파라미터에 기본인자를 준다. 또한 첫번째 템플릿 파라미터는 그 뒤의 템플릿 파라미터에서 사용 할 수 있다.

코드는 생략한다. 귀찮...



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

댓글을 달아 주세요