关于显式实例化(模板在头文件中声明并在cpp文件中定义时使用的IIRC,因为否则链接器在其他地方使用它时将无法找到它),如果模板具有静态成员变量,显式实例化是否也会实例化并创建静态成员变量?
答案 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_data
和non_template_member()
创建了int
和double
的定义。 template_member(S)
不定义,因为它仍然是一个开放的集合。
如果您没有为static_data
提供[模板化]定义,则不会实例化相应的定义。
标准的相关部分是14.7.2 [temp.explicit]第8段:
命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和模板成员)的同类(声明或定义)的显式实例化明确地专门用于包含显式实例化的翻译单元,除非如下所述。
如果没有成员定义,则仅声明static
成员,并且显式实例化只会看到实例化的声明。通过定义,显式实例化成为一个定义。
答案 1 :(得分:1)
类模板的显式实例化还实例化静态数据成员。根据C ++ 11,[temp.explicit] / 8:
命名类模板特化的显式实例化也是一个显式实例化 每个成员的同类(声明或定义)(不包括从基础继承的成员) 以前没有在包含显式的翻译单元中明确专门化的类) 实例化,除非如下所述。 [注意:此外,它通常是一个明确的实例化 关于类的某些依赖于实现的数据。 -end note ]
下面没有描述&#34;&#34;案例适用于静态数据成员。