我们什么时候需要显式实例化模板函数?

时间:2017-09-26 07:40:19

标签: c++ templates explicit-instantiation

我们说我们有一个模板功能:

template <class T> T max(T a, T b) { return a > b ? a : b; }

由于编译器在模板参数推导期间没有执行任何隐式类型转换,我们可以通过以下两种方式调用max(2, 5.5)

  1. 使用强制转换:max(static_cast<float>(2), 5.5f);
  2. 使用显式模板实例化:max<float>(2, 5.5);
  3. 第二种情况对我有意义,但是我们什么时候以下面给出的方式进行显式模板实例化(实例化而不用 char 类型调用函数max):

    template char max(char a, char b);
    

    我们从中获得了什么?

1 个答案:

答案 0 :(得分:1)

如果您正在编写库,那么库的代码未调用的模板将不会被实现,因此库可能缺少您打算提供的某些函数。 显式实例化将强制编译器为指定的模板创建实现,即使没有对它进行任何调用。

当您最终将库链接到客户端应用程序时,链接器将找到您的库支持的类型的实现。

也许英语母语人士的解释会更清晰:https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation