什么时候隐式实例化会导致问题?
When will implicit instantiation cause problems?
我正在阅读 C++ Primer,上面写着:
"If a member function isn't used, it is not instantiated. The fact that members are instantiated only if we use them lets us instantiate a class with a type that may not meet the requirements for some of the template’s operations."
我不知道为什么这是个问题。如果需要某些操作,为什么编译器不实例化这些操作?有人可以举个例子吗?
这是一个 ease-of-use 功能,而不是陷阱。
惰性实例化用于简化模板。您可以实现任何特化可能具有的所有可能成员函数的集合,即使某些函数不适用于某些特化。
它还减少了编译时间,因为编译器永远不需要实例化您不使用的东西。
要防止惰性实例化,请使用显式实例化:
template class my_template< some_arg >;
这将立即实例化 class 的所有成员(模板、继承或尚未定义的成员除外)。对于编译速度较慢的模板,您可以在一个源文件(翻译单元)中执行上述操作,然后使用链接器绕过其他源文件中的实例化,方法是在 header:[=12= 中声明]
extern template class my_template< some_arg >;
我正在阅读 C++ Primer,上面写着:
"If a member function isn't used, it is not instantiated. The fact that members are instantiated only if we use them lets us instantiate a class with a type that may not meet the requirements for some of the template’s operations."
我不知道为什么这是个问题。如果需要某些操作,为什么编译器不实例化这些操作?有人可以举个例子吗?
这是一个 ease-of-use 功能,而不是陷阱。
惰性实例化用于简化模板。您可以实现任何特化可能具有的所有可能成员函数的集合,即使某些函数不适用于某些特化。
它还减少了编译时间,因为编译器永远不需要实例化您不使用的东西。
要防止惰性实例化,请使用显式实例化:
template class my_template< some_arg >;
这将立即实例化 class 的所有成员(模板、继承或尚未定义的成员除外)。对于编译速度较慢的模板,您可以在一个源文件(翻译单元)中执行上述操作,然后使用链接器绕过其他源文件中的实例化,方法是在 header:[=12= 中声明]
extern template class my_template< some_arg >;