实例化模板是否实例化其静态数据成员?

时间:2014-06-20 11:31:55

标签: c++ templates

关于显式实例化(模板在头文件中声明并在cpp文件中定义时使用的IIRC,因为否则链接器在其他地方使用它时将无法找到它),如果模板具有静态成员变量,显式实例化是否也会实例化并创建静态成员变量?

2 个答案:

答案 0 :(得分:3)

如果显式实例化类模板,则所有非模板成员都将被实例化,包括static数据成员,只要它们也有定义。例如:

template <typename T>
struct foo {
    static int static_data;
    void non_template_member() {}
    template <typename S>
    void template_member(S) {}
};

template <typename T>
int foo<T>::static_data = 0;

template struct foo<int>;
template struct foo<double>;

底部的显式实例化为类型static_datanon_template_member()创建了intdouble的定义。 template_member(S)不定义,因为它仍然是一个开放的集合。

如果您没有为static_data提供[模板化]定义,则不会实例化相应的定义。

标准的相关部分是14.7.2 [temp.explicit]第8段:

  

命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和模板成员)的同类(声明或定义)的显式实例化明确地专门用于包含显式实例化的翻译单元,除非如下所述。

如果没有成员定义,则仅声明static成员,并且显式实例化只会看到实例化的声明。通过定义,显式实例化成为一个定义。

答案 1 :(得分:1)

类模板的显式实例化还实例化静态数据成员。根据C ++ 11,[temp.explicit] / 8:

  

命名类模板特化的显式实例化也是一个显式实例化   每个成员的同类(声明或定义)(不包括从基础继承的成员)   以前没有在包含显式的翻译单元中明确专门化的类)   实例化,除非如下所述。 [注意:此外,它通常是一个明确的实例化   关于类的某些依赖于实现的数据。 -end note ]

下面没有描述&#34;&#34;案例适用于静态数据成员。