일단 아래 코드를 컴파일 해보자. 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 를 썻다고 에러를 낸다. : )

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