其他分享
首页 > 其他分享> > c – .h文件中定义的模板类静态成员变量应该发生什么

c – .h文件中定义的模板类静态成员变量应该发生什么

作者:互联网

如果模板类定义包含依赖于模板类型的静态成员变量,我不确定应该采用什么样的可靠行为?

在我的例子中,最好将静态成员的定义放在与类定义相同的.h文件中,因为

>我希望这个类对于我目前没有的许多模板数据类型是通用的
知道.
>我只想共享静态成员的一个实例
在我的程序中为每个给定的模板类型. (一个用于所有MyClass< int>一个用于所有MyClass< double>等.

我可以最简单地说,当使用gcc 4.3编译时,列出的代码at this link完全符合我的要求.这种行为是否符合C标准,以便在使用其他编译器时可以依赖它?

这个链接不是我的代码,而是CodeMedic发布到讨论here的一个反例.我发现了其他几个像one这样的辩论,但我认为没有任何结论.

我认为链接器正在整合找到的多个定义(在示例a.o和b.o中).
这是必需/可靠的链接器行为吗?

解决方法:

从N3290,14.6:

A […] static data member of a class template shall be defined in
every translation unit in which it is implicitly instantiated […], unless the corresponding specialization is explicitly instantiated […] .

通常,您将静态成员定义与模板类定义一起放在头文件中:

template <typename T>
class Foo
{
  static int n;                       // declaration
};

template <typename T> int Foo<T>::n;  // definition

扩展特许权:如果您计划在代码中使用显式实例化,例如:

template <> int Foo<int>::n = 12;

那么你不能把模板化的定义放在标题中,如果Foo< int>也可以在除包含显式实例化的TU之外的其他TU中使用,因为您将获得多个定义.

但是,如果确实需要为所有可能的参数设置初始值而不使用显式实例化,则必须将其放在标题中,例如与TMP:

// in the header
template <typename T> int Foo<T>::n = GetInitialValue<T>::value;  // definition + initialization

标签:c,templates,static,standards,member
来源: https://codeday.me/bug/20190928/1828210.html