2017-09-26 226 views
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);

第二种情况对我来说很有意义,但是当我们做了明确的模板实例在下面给出(实例而不字符类型调用函数max):

template char max(char a, char b); 

什么是我们实现退出它?

+1

显式实例允许提供声明没有其他TU定义。 – Jarod42

+0

^- 如果您的模板只能应用于一组有限的类型,这些类型都是事先已知的,这非常有用。 – StoryTeller

回答

1

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

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

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

相关问题