具有不同实例化的静态模板类变量是否相同?

时间:2013-10-09 14:18:23

标签: c++ templates static static-members

说我有班级

template <typename T>
class MyClass
{
    static int myvar;
}

现在在以下作业中会发生什么?

MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;

根据标准会发生什么?我会有两个版本的MyClass :: myvar还是只有一个?

3 个答案:

答案 0 :(得分:7)

是的,将有两个具有两个不同值的变量。但那是因为这两个是完全不相关的类。这就是模板的工作原理。不要将它们视为类,而应将其视为构建类之后的一组规则。

答案 1 :(得分:2)

由于OP特别要求标准引用,我的答案包括标准中的相关引用。

每个专业化都有它自己的myvar副本,这是有意义的,因为每个都是它自己独特的14.7 模板实例化和专业化 6 中的C ++草案标准说(强调我的):

  

从模板实例化的每个类模板专业化都有自己的任何静态成员的副本

 [ Example:
 template<class T> class X {
     static T s;
 };
 template<class T> T X<T>::s = 0;
 X<int> aa;
 X<char*> bb;
     

X具有int类型的静态成员,X具有char *类型的静态成员。 -结束   例子]

答案 2 :(得分:1)

从“每个类型名称”的模板中实例化一个完全“新类”。由于静态成员与类绑定,因此每个类都有自己的静态变量副本。