Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;静态模板成员,每种模板类型一个实例?_C++_Templates_Static_Member - Fatal编程技术网

C++ C++;静态模板成员,每种模板类型一个实例?

C++ C++;静态模板成员,每种模板类型一个实例?,c++,templates,static,member,C++,Templates,Static,Member,通常,对于具有静态成员/对象的类的每个实例,一个类的静态成员/对象都是相同的。无论如何,如果静态对象是模板类的一部分并且也依赖于模板参数,该怎么办?例如,像这样: template<class T> class A{ public: static myObject<T> obj; } 模板 甲级{ 公众: 静态肌体; } 如果我将一个对象转换为int,另一个对象转换为float,我猜会有两个obj,每种类型一个 如果我要创建多个as类型int和多个floats的对

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

template<class T>
class A{
public:
  static myObject<T> obj;
}
模板
甲级{
公众:
静态肌体;
}
如果我将一个对象转换为
int
,另一个对象转换为
float
,我猜会有两个
obj
,每种类型一个


如果我要创建多个as类型
int
和多个
float
s的对象,它还会是两个
obj
实例吗,因为我只使用两个不同的类型?

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

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

#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;
}

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

A
A
是两种完全不同的类型,您无法在它们之间安全地强制转换。两个实例<>代码> a /c>将共享同一个静态MyObjor。C++模板中的

< P>是类的副本。我认为在您的示例中,每个模板实例将有一个静态实例。

谢谢,这很简短,但澄清了我需要知道的一切:)因为问题是关于静态成员的,如果示例程序不创建任何Foo实例,那么示例程序将更清晰。您可以使用Foo::s,而不是分配给bar1.s并将其打印出来。@jamesdlin Ug。固定的。“我不应该试图在一个句子中颠倒逻辑,然后不正确地校对。”加雷斯的观点是正确的,我指责当时我没有喝咖啡。修复了一个简化的代码。@Yacoby:在不同的编译单元中
Foo::bar=3
如何?:)为了完整起见……“C++模板实际上是类的副本”:这毫无意义。0)还有模板函数和模板成员函数,1)定义“复制”。我想你的意思是每个类模板实例化都代表一个新的类类型。是的,不像java,C++内部把类的拷贝复制到模板部分。
1,2