【问题标题】:Are static template class variables with different instantiations the same?具有不同实例化的静态模板类变量是否相同?
【发布时间】:2013-10-16 23:09:55
【问题描述】:

说我有课

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

现在接下来的作业会发生什么?

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

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

【问题讨论】:

  • @ShafikYaghmour 我正在为大量类编写手册,这个问题发生在我身上,因为我有一个设置一些静态变量的静态函数,我认为它可能是一个很好的向公众提问。可能知道标准对它的描述比尝试更好。
  • @TheQuantumPhysicist 好的,这是有道理的,我从标准中找到了引用,它说每个专业化都会有任何静态成员的副本。

标签: c++ templates static static-members


【解决方案1】:

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

【讨论】:

  • STL 曾经说过(释义):“模板是千篇一律的。你不能吃千篇一律,但你可以制作你可以用千篇一律吃的饼干”。 :P
【解决方案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 类型的静态成员 s,X 有一个 char* 类型的静态成员 s。 -结尾 例子]

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2013-09-12
      • 1970-01-01
      相关资源
      最近更新 更多