template class구현시..

junteken의 이미지

visual c++ 6.0에서 template class를 구현하게 되었습니다.
그런데 template class같은 경우에 class선언부와 구현부가 같은 파일안에
있지 않으면 LNK2001에러가 나네요...
왜그럴까요? g++에서는 같은 파일에 있지 않아도 되나요?
컴파일러에 따라서 다른건지..아니면 template만 특별히 그렇게 해줘야 하는지지...template은 공부만 했다가 오늘 우연히 구현한번 해보게 되었는데..
역시 머리로 알고있는거랑 차이가 있군요.. :lol:

모두 좋은 하루 되세요~~하늘이 참 맑네요...

yielding의 이미지

g++ 3.4와 몇몇 컴파일러는 export라는 키워드로(원래 표준이죠) 템플릿의 선언과 구현을 나눌 수 있습니다.. 하지만 나머지 대부분의 컴파일러는 아직 이 export를 비롯 c++표준을 완벽하게 구현하지 않고 있습니다.

얼마전 뉴스그룹을 보니 export의 경우는 구현의 어려움과 이 구문 자체의 효용에 대한 의문으로 많이 설전이 벌어지고 있더군요

Life rushes on, we are distracted

doldori의 이미지

표준에 따르면 export라는 키워드를 써서 일반적인 헤더와 소스 파일을 쓰는
식으로 할 수 있습니다만, 현재 이를 지원하는 컴파일러는 Comeau 이외에는
없는 것으로 알고 있습니다. 구현하기가 기술적으로 까다롭다고 하더군요.
그래서 export 키워드를 표준에서 제외하자고 주장하는 사람도 있습니다.
그러니 템플릿 클래스 구현까지 모두 #include 하도록 하는 것이 가장 확실한
방법입니다.

kihlle의 이미지

템플릿클래스의 목적파일은 컴파일타임이 아니라 링크타임에서 결정되기때문에 그러한 문제들이 발생합니다. 만일 AIX/VACPP나 혹은 SUNWspro와 같은 상용유닉스컴파일러에서 템플릿의 선언과 구현을 분리했을 경우, cfront가 적용되어 별도의 저장소에 각각의 템플릿인자에 대한 오브젝트파일이 들어가게 되는데, 이들중 어느것이 사용될지는 링크시에만 결정됩니다.
사람 쥑이는 일이죠...

어차피 꼭 링크전에 목적코드를 만들어야할 필요가 없기때문에 보통은 헤더안에다 모두 때려박는(stl도 그렇습니다) 방식을 취합니다만 그것도 cfront만 가능한 컴파일러라면 결국 gcc를 설치해야 할 것입니다.

시간이 남으신다면 구글에서 "cfront"로 검색해보심을 추천합니다.

homeless