可以在没有成员的情况下实例化类模板吗?

时间:2013-05-22 05:27:59

标签: c++ templates

Wikipedia article说:

  

实例化类模板不会导致其成员定义被实例化。

我无法想象C ++中的任何类是否被实例化,无论是否来自模板,那些类成员都没有被实例化?

3 个答案:

答案 0 :(得分:9)

许多早期的C ++编译器实例化了所有成员函数,无论你是否曾调用它们。

例如,考虑std::list,它具有sort成员函数。使用当前正常运行的编译器,您可以在不支持比较的类型上实例化list。如果您尝试使用list::sort,则会失败,因为您不支持比较。只要您没有为该列表调用sort,它就可以了,因为list<T>::sort除非您调用它,否则不会被实例化。

然而,对于那些较旧,功能较差的编译器,尝试创建list<T>意味着即使您从未使用它,list<T>::sort也会被实例化。 list::sort的存在意味着您需要为<实施T,只是为了创建list<T>,即使您从未在列表中实际使用过sort那种类型。

答案 1 :(得分:1)

该标准清楚地表明(非模板和模板)成员方法实例化仅在使用时才会发生。

摘自C ++标准(N3690 - 14.7.1(2)隐式实例化)

2除非已明确实例化或明确专门化类模板或成员模板的成员,否则在要求成员定义存在的上下文中引用特化时,将隐式实例化成员的特化。 /强>;特别是,除非静态数据成员本身以需要静态数据成员定义存在的方式使用,否则不会发生静态数据成员的初始化(以及任何相关的副作用)。

答案 2 :(得分:0)

班级的方法也是成员。类模板方法在为该实例化类调用它们时进行实例化。因此,这些成员方法可能永远不会被实例化。