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 디폴트 템플릿 인자란 무엇일까?
함수의 디폴트 매개변수 처럼 템플릿 파라미터 역시 갖을 수 있는데, 현재는 클래스 템플릿만 지원된다. 일반적으로 첫번째 템플릿 파라미터는 기본인자를 주지 않고, 그 뒤에 나오는 템플릿 파라미터에 기본인자를 준다. 또한 첫번째 템플릿 파라미터는 그 뒤의 템플릿 파라미터에서 사용 할 수 있다.
코드는 생략한다. 귀찮...
'책 정리 > C++ Template' 카테고리의 다른 글
9장, 템플릿에서의 이름 3부 : 템플릿 파싱 (0) | 2009.12.31 |
---|---|
9장, 템플릿에서의 이름 2부 : 템플릿에서 이름 룩업 규칙 (360) | 2009.12.30 |
9장, 템플릿에서의 이름 1부 : 템플릿에서 이름 평가 규칙 이해하기 (0) | 2009.12.29 |
8장, Part 4, 템플릿에서의 프렌드 : 이건 많이 다른데? (0) | 2009.07.29 |
8장, Part 3, 템플릿 인자 - 템플릿 인자의 다양한 설정 방법 (0) | 2009.07.25 |
8장, Part 1-2, 템플릿의 기초 원리의 깊은 이해 : 재미없는 템플릿의 링크 (0) | 2009.07.12 |
8장, Part 1-1, 예외적인 가상 멤버 함수 (0) | 2009.07.12 |
8장, 템플릿의 기초 원리의 깊은 이해 (360) | 2009.07.12 |
7장, 기본 템플릿 용어 (0) | 2009.07.05 |
6장, 템플릿 실제 사용 : 디버깅 템플릿 (0) | 2009.07.05 |
최근댓글