2012-05-05 15 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模板多年,對於類模板以及函數模板(N1448建議將其添加到C++狀態「此功能已實施在由Edison設計集團,GCC,IBM,Metrowerks和Microsoft提供的編譯器前端「,那是在2003年。)靜態庫不是一個新功能,它們在C++ 98或C++ 11中都沒有提及,但是這兩者都早於這兩年:-) –

+0

好的,沒有意識到它已經很好地支持類+1。 – Potatoswatter