关于显式实例化(当模板在头文件中声明并在cpp文件中定义时使用的IIRC,因为否则链接器在其他地方使用它时将无法找到它),如果模板具有静态成员变量,则将显式实例化还实例化并创建静态成员变量?
如果显式实例化类模板,则所有非模板成员都将被实例化,包括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>;
Run Code Online (Sandbox Code Playgroud)
底部的显式实例化为类型static_data和创建定义。不会有定义,因为这仍然是一个开放集。non_template_member()intdoubletemplate_member(S)
如果您不提供 [模板化] 定义static_data,它将不会实例化相应的定义。
标准的相关部分是 14.7.2 [temp.explicit] 第 8 段:
命名类模板特化的显式实例化也是其每个成员(不包括从基类继承的成员和模板成员)的同类(声明或定义)的显式实例化,这些成员之前尚未显式特化包含显式实例化的翻译单元,除非如下所述。
如果没有成员定义,static则仅声明成员,并且显式实例化只会看到声明被实例化。通过定义,显式实例化就变成了定义。
| 归档时间: |
|
| 查看次数: |
500 次 |
| 最近记录: |