在相关问题Why can templates only be implemented in the header file?中,描述了两种避免链接器错误的策略:
template class Foo<int>
语法显式实例化模板。从我收集的信息来看,#1似乎是“首选”方法并且在每个库中使用 - 大概是因为很难或不可能预测图书馆消费者想要使用哪些类型。我的问题涉及战略#2。
具体来说,我为什么要这样做?
仅供参考:我主要是C ++背景的C ++新手。我已经习惯了.NET样式的泛型,它更直接,是的,我理解为什么它们是不同的。但是,我认为C ++开发人员仍然关心耦合。表单#2是否不会引入特别烦人的耦合形式,其中开发人员必须不断编辑模板的.cpp文件,只是为了使用具有不同的,以前无法预料的类型的模板?那不是那种打败模板的目的吗?
是否存在与解决方案#2相关的合法或重要用例?
答案 0 :(得分:1)
在标题中实现整个模板有明显的优势(首选方法):
那么,为什么在实现文件中使用显式模板实例化,并且只在头文件中提供模板的接口? (纯粹的方法根本没有使用过)
还有一种混合方法,它试图获得第二种方法的一些优点,同时保留所有第一种方法:
使用extern
定义最常用的模板实例化,并提供共享库中的显式实例化。
这具有第一种方法的所有优点,但只有第二种方法的一个优点:
这些显式实例化可以在共享库中。
共享C ++语言库使用这种混合方法。
BTW:委员会不满足于当前的事态:答案 1 :(得分:0)
如果要编写可供任何人使用的泛型类或函数,请使用数字1。如果要为多个特定类型重载类或函数,请使用数字2,但它们都具有相同的实现。