首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板的静态成员是全局唯一的吗?

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

Stack Overflow用户
提问于 2013-04-05 01:38:12
回答 2查看 102关注 0票数 3

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

代码语言:javascript
复制
// 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?如果语法不正确,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-05 01:40:14

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

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

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

命名空间范围内类的

静态数据成员具有外部链接 (3.5)。局部类不应该有静态数据成员。

换句话说,这段代码:

代码语言:javascript
复制
#include <iostream>

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

将把5打印到标准输出。这是一个live example

票数 5
EN

Stack Overflow用户

发布于 2013-04-05 02:03:39

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15817975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档