14

通常、1つのクラスの静的メンバー/オブジェクトは、静的メンバー/オブジェクトを持つクラスの各インスタンスで同じです。とにかく、静的オブジェクトがテンプレートクラスの一部であり、テンプレート引数にも依存している場合はどうでしょうか。たとえば、次のようになります。

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

Aのオブジェクトを1intつ、別のオブジェクトをとしてキャストすると、タイプごとに1つずつ、float合計2つになると思います。obj

タイプとしてAの複数のオブジェクトを作成し、複数のオブジェクトを作成するint場合、2つの異なるタイプしか使用していないので、floatそれでも2つのインスタンスになりますか?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>はまったく異なる2つのタイプであるため、それらの間で安全にキャストすることはできません。ただし、の2つのインスタンスはA<int>同じ静的myObjectを共有します。

于 2010-02-08T10:49:06.993 に答える
3

クラスと同じ数の静的メンバー変数があり、これはテンプレートにも同様に適用されます。テンプレートクラスを個別にインスタンス化するたびに、静的メンバー変数が1つだけ作成されます。これらのテンプレート化されたクラスのオブジェクトの数は関係ありません。

于 2010-02-08T10:48:33.560 に答える
1

C ++では、テンプレートは実際にはクラスのコピーです。あなたの例では、テンプレートインスタンスごとに1つの静的インスタンスがあると思います。

于 2010-02-08T10:49:17.163 に答える