现在看看现有的答案,我仍然不确定答案是什么。这是我的例子
// 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?如果语法不正确,请告诉我。
答案 0 :(得分:5)
这是否意味着fa.t和fb.t也是5?
是的,static
数据成员由类的所有实例共享,因为fa
,fb
和fc
都是同一个类的实例{ {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.t
,fb.t
,fc.t
和foo<int>::t
是
所有相同的变量。但我不确定这是不是你的意思
真的问:foo<int>::t
和foo<double>::t
不同的变量。
正如Pete Becker在评论中所说,每个类的实例化 模板结果在一个类中,其行为与完全相同 非模板类。另一方面,每个都不同 实例化是一个独特的无关类,具有自己的类 静态成员。