2012-05-05 11 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