【发布时间】:2014-07-28 23:25:03
【问题描述】:
在相关问题Why can templates only be implemented in the header file? 中,描述了避免链接器错误的两种策略:
- 在头文件中实现整个模板;或
- 使用
template class Foo<int>语法显式实例化模板。
据我所知,#1 似乎是“首选”方法,并且在每个库中都使用了 - 大概是因为很难或不可能预测库使用者想要使用哪些类型。我的问题涉及策略 #2。
具体来说,我为什么要这样做?
仅供参考:我大多是 C++ 新手,具有丰富的 C# 背景。我已经习惯了 .NET 风格的泛型,这更简单一些,是的,我理解 为什么 它们是不同的。但是,我假设 C++ 开发人员仍然关心耦合。表格 #2 是否不会引入一种特别烦人的耦合形式,开发人员必须不断编辑模板的 .cpp 文件,才能将模板用于不同的、以前无法预料的类型?这不是违背了模板的目的吗?
是否存在与解决方案 #2 相关的合法或重要用例?
【问题讨论】:
-
是的,有一个明显的重要用例:在大多数桌面/服务器平台上链接的动态 C++ 库 (dll / so) 包含最常用模板的实例化,即使它们可能没有那里需要。 (尽管如此,尽管它们被声明为
extern以避免非内联实例化,但它们仍然在头文件中完全定义) -
@Deduplicator:你能解释一下为什么这是一个好处吗?我不是在质疑它,我只是不太明白,并且希望在答案形式中进行一些详细说明。
-
@Aaronaught 它加速了编译和链接,如果模板是预先实例化的,那么编译器就不必为每个目标文件创建单独的实例。在链接期间,链接器也不必解析多个实例化。