模板的静态成员是全局唯一的吗?

时间:2013-04-04 17:38:12

标签: c++ templates static-members

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

// 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?如果语法不正确,请告诉我。

2 个答案:

答案 0 :(得分:5)

  

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

是的,static数据成员由类的所有实例共享,因为fafbfc都是同一个类的实例{ {1}},他们共享foo<int>数据成员。

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

  

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

换句话说,这个片段:

static

#include <iostream> int main () { fc.t = 5; std::cout << fa.t; } 打印到标准输出。这是live example

答案 1 :(得分:0)

在您的示例中,fa.tfb.tfc.tfoo<int>::t是 所有相同的变量。但我不确定这是不是你的意思 真的问:foo<int>::tfoo<double>::t 不同的变量。

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