0

假设我们有一个模板函数:

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);

第二种情况对我来说是有意义的,但是我们什么时候以下面给出的方式进行显式模板实例化(实例化而不调用char类型的函数)max

template char max(char a, char b);

我们能从中获得什么?

4

1 回答 1

1

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

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

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

于 2017-09-26T10:14:06.357 回答