我在C++中創建了一些靜態庫。其中一個類是一個哈希表類,它使用另外兩個來創建對象。我試着在另一個問題的答案中嘗試了另一個small demonstration,但是我生成的庫似乎沒有定義我在測試程序中編寫的任何東西。我已經在單個文件中嘗試了所有聲明&實現,並將它們分離爲頭文件/源代碼,但是這種安排似乎並不重要。如何讓我的類進入靜態libHash.a?如何從我的嵌套模板類創建一個靜態庫?
回答
以對象形式分發模板不能很好地工作,因爲編譯器無法創建新實例。您的庫的用戶只能訪問庫中定義的模板實例。
這就是爲什麼模板類和函數通常在頭文件中實現的原因。
如果類不是模板化的,是否有創建庫的方法? –
@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模板多年,對於類模板以及函數模板(N1448建議將其添加到C++狀態「此功能已實施在由Edison設計集團,GCC,IBM,Metrowerks和Microsoft提供的編譯器前端「,那是在2003年。)靜態庫不是一個新功能,它們在C++ 98或C++ 11中都沒有提及,但是這兩者都早於這兩年:-) –
好的,沒有意識到它已經很好地支持類+1。 – Potatoswatter
- 1. 如何從多個靜態庫中創建一個靜態庫?
- 2. 如何定義一個嵌套模板的靜態成員(模板類內的模板類)
- 3. 如何爲指針類創建一個靜態模板函數?
- 4. 如何模板類從嵌套的模板類
- 5. 嵌套靜態類
- 6. 靜態嵌套類
- 7. 我們是否可以從靜態嵌套類訪問非靜態嵌套類的非靜態方法
- 8. 如何爲我的程序創建一個靜態庫?
- 9. VB:我如何創建嵌套類?
- 10. Java:如何從靜態嵌套類引用外部類的非靜態字段?
- 11. 創建一個引用其他靜態庫的靜態庫
- 12. CMake的 - 創建一個靜態庫
- 13. 靜態嵌套類型
- 14. 嵌套靜態類C#
- 15. JAVA用反射創建嵌套靜態類的實例
- 16. 在Java中創建靜態嵌套類的實例
- 17. 如何創建具有作爲一個模板,模板等一個模板類
- 18. 創建一個類的靜態實例
- 19. 非靜態嵌套線程 - 從另一個類(Java)訪問
- 20. 一組用於嵌套靜態類
- 21. Xcode - 將一個靜態庫嵌入另一個靜態庫?
- 22. 從多個來源創建靜態庫
- 23. C++:嵌套類模板類
- 24. 的typedef嵌套模板類
- 25. 如何定義一個模板類的靜態常量變量
- 26. 如何使用從Java中的嵌套接口繼承的靜態方法定義嵌套靜態類?
- 27. 我如何動態地創建我的文件夾中創建動態圖像靜態鏈接Django模板
- 28. XSD文件使用JAXB創建嵌套靜態類
- 29. Makefile ...創建一個靜態庫
- 30. Makefile文件 - 創建一個靜態庫
模板是內部實現細節還是公共接口的一部分? –
它們旨在成爲公共接口。 –