我在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文件 - 创建一个静态库
模板是内部实现细节还是公共接口的一部分? –
它们旨在成为公共接口。 –