일단 아래 코드를 컴파일 해보자. 100% 안될 것이라고? 어디에서..?
g++43
msvc9
.. 이런 g++ 과 msvc9의 에러 결과가 똑같을 줄 알았는데, 틀리다. 책의 설명되론 되어 있는건 g++의 에러 결과이다. msvc9에선 5, 8에 대해선 언급조차 없다. 사실 나는 4라인과 6라인에서 날것이라고 생각했지만 틀렸다. : )
int C, class C 이게 컴파일 되?
그렇다. 된다. 왜냐하면 int C의 C 가 존재하는 구역과 class C의 C가 존재하는 구역이 서로 다르다. 여기서의 구역은 이름이 존재하는 구역이다. 여기서의 이름이란 사람의 이름처럼 중복가능한게 아니라, 절대 중복되지 않는 이름을 뜻한다. 한 녀석은 은하계에서 멀리 떨어진 안드로메다에 있는 이름이고 한녀석은 지구에 있는 이름이기 때문이다. 서로 이름이 존재하는 구역이 달라 상관없다는 것이다.
int X, template <typename T> class X 이건 왜 안되?
책 설명에는 그냥 같이 존재 할 수 없다고 되어 있다. 아마도 같은 이름 구역에 존재하지 않을까 추측해 본다. 하지만 msvc9 에선 서로 다른 구역에 존재하는지 잘 컴파일 된다.
struct S, template <typename T> class S 이건 왜 안되?
역시 그 이유와 마찬가지다.
일반적으로 템플릿의 경우 외부 링크를 갖는다. 이 말은 번역은 무수히 많이 해도, 단 한개의 정의에 링크 된다는 것이다. 예외적으로 static 을 갖는 함수 템플릿은 그 실체가 파일 단위로 존재 한다.
그리고 템플릿은 함수 내에서 선언 될 수 없다. 다음 코드를 컴파일 해보면 알 수 있을 것이다.
g++43
msvc9
그러고 보니 두 컴파일러의 에러를 보는건 참 재미있다. 에러 위치와 에러 설명이 각각 다른데. msvc9는 정확하게 에러를 집는 반면, g++은 함수가 끝나기 전에 template 를 썻다고 에러를 낸다. : )
'책 정리 > C++ Template' 카테고리의 다른 글
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 2, 템플릿의 기초 원리의 깊은 이해 - 템플릿 파라미터 (0) | 2009.07.25 |
8장, Part 1-1, 예외적인 가상 멤버 함수 (0) | 2009.07.12 |
8장, 템플릿의 기초 원리의 깊은 이해 (360) | 2009.07.12 |
7장, 기본 템플릿 용어 (0) | 2009.07.05 |
6장, 템플릿 실제 사용 : 디버깅 템플릿 (0) | 2009.07.05 |
6장, 템플릿 실제 사용 : 미리 컴파일된 헤더 (0) | 2009.07.03 |
최근댓글