我正在阅读C ++ Primer,它说:
“如果未使用成员函数,则不会实例化。仅当我们使用成员时才会实例化成员这一事实让我们实例化一个类型可能不符合某些模板操作要求的类。 “
我不知道为什么这是一个问题。如果需要某些操作,为什么编译器不实例化这些操作?有人能举个例子吗?
答案 0 :(得分:2)
这是一个易于使用的功能,而不是陷阱。
Lazy instantiation用于简化模板。您可以实现任何特化可能具有的所有可能成员函数的集合,即使某些函数不适用于某些特化。
它还减少了编译时间,因为编译器永远不需要实例化你不使用的东西。
要防止延迟实例化,请使用显式实例化:
template class my_template< some_arg >;
这将立即实例化该类的所有成员(除了模板,继承或尚未定义的成员)。对于编译速度慢的模板,您可以在一个源文件(翻译单元)中执行上述操作,然后使用链接器绕过其他源文件中的实例化,方法是在标头中添加一个声明:
extern template class my_template< some_arg >;