C++ 实例化模板是否实例化其静态数据成员?
关于显式实例化(当模板在头中声明并在cpp文件中定义时使用IIRC,因为否则链接器在其他地方使用时将无法找到它),如果模板具有静态成员变量,显式实例化还会实例化并创建静态成员变量吗?类模板的显式实例化也会实例化静态数据成员。根据C++11,[temp.explicit]/8: 命名类模板专门化的显式实例化也是 其每个成员的相同种类(声明或定义)(不包括从base继承的成员) 类)之前未在包含显式 实例化,除非如下所述。[注:此外,它通常是 有关该类的特定实现相关数据。-结束说明]C++ 实例化模板是否实例化其静态数据成员?,c++,templates,C++,Templates,关于显式实例化(当模板在头中声明并在cpp文件中定义时使用IIRC,因为否则链接器在其他地方使用时将无法找到它),如果模板具有静态成员变量,显式实例化还会实例化并创建静态成员变量吗?类模板的显式实例化也会实例化静态数据成员。根据C++11,[temp.explicit]/8: 命名类模板专门化的显式实例化也是 其每个成员的相同种类(声明或定义)(不包括从base继承的成员) 类)之前未在包含显式 实例化,除非如下所述。[注:此外,它通常是 有关该类的特定实现相关数据。-结束说明] 并且“下面描述
并且“下面描述的”情况都不适用于静态数据成员。如果显式实例化类模板,则所有非模板成员都将被实例化,包括
静态
数据成员,只要它们也有定义。例如:
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>;
模板
结构foo{
静态int静态u数据;
无效的非\u模板\u成员(){}
模板
无效模板_成员{}
};
模板
int foo::static_data=0;
模板结构foo;
模板结构foo;
底部的显式实例化为类型int
和double
创建静态数据和非模板成员()的定义。由于这仍然是一个开放集,因此不会有模板成员的定义
如果您没有为静态\u数据
提供[templated]定义,它将不会实例化相应的定义
本标准的相关章节为14.7.2【临时明确】第8段:
命名类模板专门化的显式实例化也是其每个成员(不包括从基类继承的成员和作为模板的成员)的同类(声明或定义)的显式实例化之前在包含显式实例化的翻译单元中未显式专门化的,除非如下所述
没有成员定义,静态
成员只被声明,显式实例化只会看到声明被实例化。有了这个定义,显式实例化就变成了一个定义。为什么不试试看呢?O_o@TonyD因为这可能会给出OP使用的编译器和链接器及其错误的具体答案?@Angew:是的-'因为编译器和链接器都充满了错误。@TonyD在所有不太常见的情况和极端情况下严格遵循标准的错误?也许没有“谜语”,但这远非闻所未闻。