2013-10-09 45 views
6

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

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

现在会发生什么事在下面的任务?

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

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

+3

简单的答案,两个 – john

+1

@ShafikYaghmour我正在编写一个庞大的一组类的手册,这个问题发生在我身上,因为我有一个静态函数,它设置了一些静态变量,我认为它可能是一个很好的向公众提问。大概知道标准说什么比尝试更好。 –

+1

@TheQuantumPhysicist好吧,这是有道理的,我发现从标准的引用说,每个专业化将有任何静态成员的副本。 –

回答

2

由于OP特别要求标准报价,这里是我的答案,其中包括来自标准的相关报价。

每个专业都有自己的myvar副本,这是有道理的,因为每个专业都是自己独特的。在第14.7模板实例化和专业化款说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类型的静态成员S和X具有char类型的静态成员S *。 - end example]

7

是的,会有两个变量和两个不同的值。但那是因为这两个是完全无关的类。这就是模板的工作原理。不要把它们看作是阶级,而是把它们看作是建立阶级之后的一系列规则。

+1

STL曾经说过(解释):“模板是曲奇刀,你不能吃饼干刀,但你可以用饼干刀做饼干。 :P – Simple

1

从'each typename'的模板实例化完全'新类'。由于静态成员与类绑定,所以这些类中的每一个都有自己的静态变量副本。

相关问题