정적 라이브러리를 만들려는 C++ 클래스가 있습니다. 클래스 중 하나는 객체를 생성하기 위해 다른 두 클래스를 사용하는 해시 테이블 클래스입니다. 나는 또 다른 질문에 대한 답변에서 또 다른 small demonstration을 시도했지만, 내가 생성 한 라이브러리는 테스트 프로그램에서 작성한 것을 정의하지 않는 것처럼 보인다. 모든 선언을 모두 시도한 & 단일 파일 및 머리글/소스로 구분 된 있지만 배열은 중요하지 않습니다. 클래스를 정적 libHash.a로 가져 오려면 어떻게해야합니까?중첩 된 템플릿 클래스에서 정적 라이브러리를 만드는 방법은 무엇입니까?
답변
개체 형식으로 템플릿을 배포하는 것은 컴파일러가 새로운 인스턴스를 만들 수 없기 때문에 잘 작동하지 않습니다. 라이브러리 사용자는 라이브러리에 정의 된 템플릿 인스턴스화에만 액세스 할 수 있습니다.
그래서 템플릿 클래스와 함수는 일반적으로 헤더 파일에 구현됩니다.
당신은 도서관에서 템플릿을을 인스턴스화를 넣을 수 있습니다 또한 Why can templates only be implemented in the header file?
클래스가 템플릿 화되지 않은 경우 라이브러리를 만드는 방법이 있습니까? –
@Brenton : 개체 파일을 직접 전달하면 응용 프로그램이 올바르게 연결됩니까? –
음, 방금 클래스를 포함하는 객체 파일을 main.cpp와 함께 컴파일러에 전달했습니다.이 파일은이 파일을 사용하기로되어 있지만 링크되지 않습니다. 만약 내가 전체 프로그램 (#includes 클래스와 함께) 전체 파일에서 객체 파일을 생성하고 그 객체 파일이 의도 한 프로그램을 잘 만들 것이다. –
볼 수 있지만, 템플릿은 헤더에 있어야합니다. 당신은 템플릿의 전문 당신이 다음 인스턴스화 할 미리 알고 있다면 당신은 컴파일됩니다 그 .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>
) 알 수 없으므로이를 인스턴스화 할 수 없으므로 라이브러리에 넣을 수 없습니다.
이것은 C++ 11 기능입니다. C++ 03에서 일부 컴파일러는 적어도 함수 템플릿에 대해 'extern'을이 방법으로 사용할 수 있도록했지만 순수 선언과 정적 라이브러리에 대한 지원은 언어의 새로운 기능입니다. – Potatoswatter
예, C++ 03에서는 유효하지 않지만 모든 주요 컴파일러는 수년간 extern 템플릿, 함수 템플릿 (C141에 추가 할 N1448 제안)을 지원했습니다. "이 기능은 구현되었습니다 GCC, IBM, Metrowerks 및 Microsoft "가 제공하는 컴파일러 프론트 엔드에서 2003 년에 발표되었습니다.) 정적 라이브러리는 새로운 기능이 아니며 C++ 98 또는 C++ 11에서 언급되지 않았습니다. 하지만 몇 년 전부터 :-) –
OK, 클래스에 이미 잘 지원되었다는 것을 깨닫지 못했습니다. +1. – Potatoswatter
- 1. Xcode 프로젝트에서 정적 라이브러리를 만드는 방법은 무엇입니까?
- 2. 부스트 정적 라이브러리를 만드는 방법은 무엇입니까?
- 3. XCode4.2로 정적 라이브러리를 만드는 방법은 무엇입니까?
- 4. Facebook SDK 정적 라이브러리를 만드는 방법은 무엇입니까?
- 5. 정적 라이브러리를 배포하는 방법은 무엇입니까?
- 6. 클래스에서 임의의 (boost.random) 라이브러리를 래핑하는 방법은 무엇입니까?
- 7. 정적 라이브러리를 수정하는 방법은 무엇입니까?
- 8. MacOS에서 안드로이드 응용 프로그램을위한 팻 정적 라이브러리를 만드는 방법은 무엇입니까?
- 9. 똑똑하고 중첩 된 링크를 만드는 방법은 무엇입니까?
- 10. 중첩 된 양식을 만드는 올바른 방법은 무엇입니까?
- 11. XCode에서 개인 정적 라이브러리를 사용하는 공용 정적 라이브러리를 만드는 방법은 무엇입니까?
- 12. 중첩 된 정적 클래스에서 확장 메서드를 사용할 수 없습니까?
- 13. 공유 MuPDF 라이브러리를 만드는 방법은 무엇입니까?
- 14. 템플릿 메서드에 사용 된 정적 클래스 멤버를 초기화하는 방법은 무엇입니까?
- 15. 부스트에서 라이브러리를 만드는 방법은 무엇입니까?
- 16. 중간 라이브러리를 만드는 방법은 무엇입니까?
- 17. 보고서 라이브러리를 만드는 방법은 무엇입니까?
- 18. 중첩 된 OpenGL 캔버스를 만드는 가장 좋은 방법은 무엇입니까
- 19. 중첩 된 장고 템플릿
- 20. 콧수염과 중첩 된 템플릿
- 21. PHP 라이브러리를 만드는 방법, PHP 라이브러리를 독립적으로 만드는 방법은 무엇입니까?
- 22. 중첩 된 일반 매개 변수로 MinMaxPriorityQueue를 만드는 방법은 무엇입니까?
- 23. 모든 클래스에서 정적 변수를 설정하는 방법은 무엇입니까?
- 24. 다른 정적 라이브러리를 공유하는 정적 라이브러리를 연결합니다.
- 25. 정적 클래스에서 명명 된 인스턴스를 확인하는 방법은 무엇입니까?
- 26. 상속 된 클래스에서 정적 변수를 초기화하는 방법은 무엇입니까?
- 27. 중첩 영역을 만드는 방법은 무엇입니까?
- 28. Java의 중첩 인터페이스에서 상속 된 정적 메서드로 중첩 정적 클래스를 정의하는 방법은 무엇입니까?
- 29. "자체 포함"정적 라이브러리를 생성하는 방법은 무엇입니까?
- 30. 중첩 된 템플릿 유형 캐스팅
템플릿이 내부 구현 세부 사항입니까, 아니면 공용 인터페이스의 일부입니까? –
그들은 공용 인터페이스를위한 것입니다. –