2012-05-05 3 views
1

정적 라이브러리를 만들려는 C++ 클래스가 있습니다. 클래스 중 하나는 객체를 생성하기 위해 다른 두 클래스를 사용하는 해시 테이블 클래스입니다. 나는 또 다른 질문에 대한 답변에서 또 다른 small demonstration을 시도했지만, 내가 생성 한 라이브러리는 테스트 프로그램에서 작성한 것을 정의하지 않는 것처럼 보인다. 모든 선언을 모두 시도한 & 단일 파일 및 머리글/소스로 구분 된 있지만 배열은 중요하지 않습니다. 클래스를 정적 ​​libHash.a로 가져 오려면 어떻게해야합니까?중첩 된 템플릿 클래스에서 정적 라이브러리를 만드는 방법은 무엇입니까?

+0

템플릿이 내부 구현 세부 사항입니까, 아니면 공용 인터페이스의 일부입니까? –

+0

그들은 공용 인터페이스를위한 것입니다. –

답변

4

개체 형식으로 템플릿을 배포하는 것은 컴파일러가 새로운 인스턴스를 만들 수 없기 때문에 잘 작동하지 않습니다. 라이브러리 사용자는 라이브러리에 정의 된 템플릿 인스턴스화에만 액세스 할 수 있습니다.

그래서 템플릿 클래스와 함수는 일반적으로 헤더 파일에 구현됩니다.

당신은 도서관에서 템플릿을을 인스턴스화를 넣을 수 있습니다 또한 Why can templates only be implemented in the header file?

+0

클래스가 템플릿 화되지 않은 경우 라이브러리를 만드는 방법이 있습니까? –

+0

@Brenton : 개체 파일을 직접 전달하면 응용 프로그램이 올바르게 연결됩니까? –

+0

음, 방금 클래스를 포함하는 객체 파일을 main.cpp와 함께 컴파일러에 전달했습니다.이 파일은이 파일을 사용하기로되어 있지만 링크되지 않습니다. 만약 내가 전체 프로그램 (#includes 클래스와 함께) 전체 파일에서 객체 파일을 생성하고 그 객체 파일이 의도 한 프로그램을 잘 만들 것이다. –

1

볼 수 있지만, 템플릿은 헤더에 있어야합니다. 당신은 템플릿의 전문 당신이 다음 인스턴스화 할 미리 알고 있다면 당신은 컴파일됩니다 그 .cpp에서 그 명시 적 인스턴스화를 정의하고 .a

// hash.h 

template<typename T> struct Hash { }; 
// declare explicit instantiation 
extern template class Hash<int>; 

// Hash.cpp 

#include <Hash.h> 
// define explicit instantiation 
template class Hash<int>; 

로하지만 인스턴스화에 대한 넣어 다음 헤더에 명시 적 인스턴스화를 선언 할 수 있습니다 사전에 (예 : Hash<SomeOtherPersonsType>) 알 수 없으므로이를 인스턴스화 할 수 없으므로 라이브러리에 넣을 수 없습니다.

+0

이것은 C++ 11 기능입니다. C++ 03에서 일부 컴파일러는 적어도 함수 템플릿에 대해 'extern'을이 방법으로 사용할 수 있도록했지만 순수 선언과 정적 라이브러리에 대한 지원은 언어의 새로운 기능입니다. – Potatoswatter

+0

예, C++ 03에서는 유효하지 않지만 모든 주요 컴파일러는 수년간 extern 템플릿, 함수 템플릿 (C141에 추가 할 N1448 제안)을 지원했습니다. "이 기능은 구현되었습니다 GCC, IBM, Metrowerks 및 Microsoft "가 제공하는 컴파일러 프론트 엔드에서 2003 년에 발표되었습니다.) 정적 라이브러리는 새로운 기능이 아니며 C++ 98 또는 C++ 11에서 언급되지 않았습니다. 하지만 몇 년 전부터 :-) –

+0

OK, 클래스에 이미 잘 지원되었다는 것을 깨닫지 못했습니다. +1. – Potatoswatter

관련 문제