14

通常一个类的静态成员/对象对于具有静态成员/对象的类的每个实例都是相同的。无论如何,如果静态对象是模板类的一部分并且还依赖于模板参数呢?例如,像这样:

template<class T>
class A{
public:
  static myObject<T> obj;
}

如果我将 A 的一个对象转换为 ,将另一个对象转换intfloat,我想会有两个obj,每种类型一个?

如果我将 A 的多个对象创建为类型int和多个floats,它是否仍然是两个obj实例,因为我只使用两种不同的类型?

4

4 回答 4

23

对于每个不同的模板初始化,静态成员都是不同的。这是因为每个模板初始化都是编译器第一次遇到模板的特定初始化时生成的不同类。

这段代码显示了静态成员变量不同的事实:

#include <iostream>

template <class T> class Foo {
  public:
    static int bar;
};

template <class T>
int Foo<T>::bar;

int main(int argc, char* argv[]) {
  Foo<int>::bar = 1;
  Foo<char>::bar = 2;

  std::cout << Foo<int>::bar  << "," << Foo<char>::bar;
}

这导致

1,2
于 2010-02-08T10:48:11.190 回答
5

A<int>并且A<float>是两种完全不同的类型,您不能安全地在它们之间进行转换。的两个实例A<int>将共享相同的静态 myObject。

于 2010-02-08T10:49:06.993 回答
3

静态成员变量与类一样多,这同样适用于模板。模板类的每个单独实例化只创建一个静态成员变量。这些模板类的对象数量无关紧要。

于 2010-02-08T10:48:33.560 回答
1

在 C++ 中,模板实际上是类的副本。我认为在您的示例中,每个模板实例都会有一个静态实例。

于 2010-02-08T10:49:17.163 回答