gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:37:44 27 4
gpt4 key购买 nike

关于显式实例化(当模板在 header 中声明并在 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>;

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

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

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

An explicit instantiation that names a class template specialization is also an explicit instantiation of the same kind (declaration or definition) of each of its members (not including members inherited from base classes and members that are templates) that has not been previously explicitly specialized in the translation unit containing the explicit instantiation, except as described below.

如果没有成员定义,static 成员只会被声明,显式实例化只会看到被实例化的声明。通过定义,显式实例化成为定义。

关于c++ - 实例化模板是否实例化其静态数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24326311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com