template <typename T>
class MyClass
{
static int myvar;
}
现在会发生什么事在下面的任务?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根据标准会发生什么?我会有两个版本的MyClass :: myvar或只有一个?
template <typename T>
class MyClass
{
static int myvar;
}
现在会发生什么事在下面的任务?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
根据标准会发生什么?我会有两个版本的MyClass :: myvar或只有一个?
由于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]
是的,会有两个变量和两个不同的值。但那是因为这两个是完全无关的类。这就是模板的工作原理。不要把它们看作是阶级,而是把它们看作是建立阶级之后的一系列规则。
STL曾经说过(解释):“模板是曲奇刀,你不能吃饼干刀,但你可以用饼干刀做饼干。 :P – Simple
从'each typename'的模板实例化完全'新类'。由于静态成员与类绑定,所以这些类中的每一个都有自己的静态变量副本。
简单的答案,两个 – john
@ShafikYaghmour我正在编写一个庞大的一组类的手册,这个问题发生在我身上,因为我有一个静态函数,它设置了一些静态变量,我认为它可能是一个很好的向公众提问。大概知道标准说什么比尝试更好。 –
@TheQuantumPhysicist好吧,这是有道理的,我发现从标准的引用说,每个专业化将有任何静态成员的副本。 –