看着现在可用的答案,我仍然不确定答案是什么。下面是我的例子
// 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?如果语法不正确,请告诉我。
发布于 2013-04-05 01:40:14
是否意味着fa.t和fb.t也是5?
是的,static数据成员由类的所有实例共享,并且由于fa、fb和fc都是同一个类foo<int>的实例,因此它们共享static数据成员。
您的对象的类型是模板的实例这一事实与此无关,也与您的对象是在不同的翻译单元中实例化的事实无关。正如C++11标准的第9.4/5段所规定的:
命名空间范围内类的
静态数据成员具有外部链接 (3.5)。局部类不应该有静态数据成员。
换句话说,这段代码:
#include <iostream>
int main ()
{
fc.t = 5;
std::cout << fa.t;
}将把5打印到标准输出。这是一个live example。
发布于 2013-04-05 02:03:39
在您的示例中,fa.t、fb.t、fc.t和foo<int>::t都是同一个变量。但我不确定这是否是您真正想问的:foo<int>::t和foo<double>::t是不同的变量。
正如Pete Becker在评论中所说,类模板的每个实例化都会产生一个类,它的行为与非模板类完全相同。另一方面,每个不同的实例化都是一个不同的、不相关的类,具有自己的静态成员。
https://stackoverflow.com/questions/15817975
复制相似问题