출처 : 구글님

 

기초지식의 한계인가...

 

C++공부를 처음부터 다시 해야 하나...

 

죠낸 짱난다...

 

===========================================================================================================================

 

OBJ 파일을 만들 때, 템플릿 코드를 분리하게 되면, 컴파일러의 번역 단위가 분리되게 되는데, 템플릿 특성상 "사용하지 않는 코드는 인스턴스화 되지 않는다" 그래서 컴파일할 때 현재의 번역 단위에선 선언만 인스턴스화 되고, 본체는 인스턴스화되지 않아 , 링커가 동작할 될 때, 링킹 에러가 나오게 된다.

링커의 에러에서 볼수 있듯이, 해당 정의를 찾지 못한다. 찾지 못하는 이유는 해당 정의를 담고 있는 오브젝트 파일을 만들지 못해서 생길 일이다. 만들지 못하는 이유는 템플릿 코드는 사용하지 않으면 코드 인스턴스화가 일어나지 않아, 컴파일러가 코드를 생성하지 못했기 때문인데, 템플릿의 경우, "같은 컴파일 번역 단위에 놓일 경우, 알아서 인스턴스화 되고, 명시적으로 사용 했을 때, 명시적으로 지정한 것들만 인스턴스화 되고,  키워드를 통해 컴파일러에게 알렸을 때, 일반 분리 모델 처럼(?) 사용 할 수 있다."

===========================================================================================================================

 

템플릿은... 헤더에 다 정의해야 합니다.

 

템플릿 특성 상 사용할 때 실체를 만들게 되는데 링크단계 이전에는
다른 소스 파일의 내용을 활용할 수 없기 때문에
실체를 만들기 위해서 모두 헤더에 두어 헤더 파일 포함만으로
실체를 만들 정보를 모두 얻기 위해서 헤더에 정의하는 것이 아닐까 생각됩니다.

 

C++ Template 이 사실 막장 스펙이라 Export 를 구현하기가 쉽지 않을 뿐더러 거의 소스 AST 를 그대로 넣지 않으면 안되는 수준에 C++ 컴파일러간 class member function mangling 규약도 다른 판에 AST 까지 맞추는건 뭐 거의 안드로메다지요. 걍 헤더에 잘 넣으시고 쓰시는게 답입니다

 

 

 

참고 :

http://www.ikpil.com/1020

 

http://www.gpgstudy.com/forum/viewtopic.php?p=106757

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스

댓글을 달아 주세요