3

查看现在可用的答案,我仍然不确定答案是什么。这是我的例子

// foo.h
template <class T> class foo
{
public:
    static T t;
};
template <class T> T foo<T>::t = 0;

// a.cpp
#include "foo.h"
foo<int> fa;

// b.cpp
#include "foo.h"
foo<int> fb;

// c.cpp
#include "foo.h"
foo<int> fc;

int main (int argc, char* argv[])
{
    fc.t = 5;
}

这是否意味着 fa.t 和 fb.t 也是 5?如果语法不正确,请告诉我。

4

2 回答 2

5

这是否意味着 fa.t 和 fb.t 也是 5?

是的,一个static数据成员由一个类的所有实例共享,并且由于fafbfc都是同一个类的实例foo<int>,它们共享该static数据成员。

您的对象的类型是模板的实例这一事实与此无关,您的对象在不同的​​翻译单元中实例化也无关紧要。正如 C++11 标准的第 9.4/5 段所述:

命名空间范围内的类的静态数据成员具有外部链接(3.5)。本地类不应具有静态数据成员。

换句话说,这个片段:

#include <iostream>

int main ()
{
    fc.t = 5;
    std::cout << fa.t;
}

将打印5到标准输出。这是一个活生生的例子

于 2013-04-04T17:40:14.203 回答
0

在您的示例中fa.tfb.tfc.tfoo<int>::t都是同一个变量。但是我不确定这是否是您真正要问的: foo<int>::t并且foo<double>::t不同的变量。

正如 Pete Becker 在评论中所说,类模板的每个实例化都会产生一个类,该类的行为与非模板类完全相同。另一方面,每个不同的实例化都是一个不同的、不相关的类,具有自己的静态成员。

于 2013-04-04T18:03:38.607 回答