2
// A.h
class A {
public:
  static int a;
};
int A::a = 0;

複数の .cpp ファイルに含めようA.hとすると、リンクが .cpp で失敗しmultiple definition of A::aます。各 .obj ファイルに含まれているため、これは理にかなっていると思いますA::a

ただし、テンプレートを使用することはできますが、

// A.h
template<class T>
class A {
public:
  static T a;
};
template<class T>
T A<T>::a = 0;

複数の .cpp ファイルに含めることができるようになりました。A.hまた、1 つの .cpp ファイルに値を割り当てて、A<int>::a = 100;.cpp ファイルで同じ値を別のファイルに取得することもできますA<int>::a

  • テンプレートがそのような違いを生むのはいつですか?
  • この静的変数のコピーは 1 つだけですか? この変数を保持する .obj はどれですか?
  • コンストラクターは一度だけ呼び出されますか? 初期値が違うとどっちが勝つ?
4

2 に答える 2

1

テンプレートがそのような違いを生むのはいつですか?

いつも。質問を理解していないと思います。

この静的変数のコピーは 1 つだけですか?

Tテンプレートのインスタンス化に使用された個別の型ごとに、最終的なプログラムで 1 つのコピーのみ。

この変数を保持する .obj はどれですか?

テンプレートがインスタンス化された翻訳単位から生成されたそれらのすべて。次に、リンカーは 1 つを選択し、他のすべてを破棄します。

コンストラクターは一度だけ呼び出されますか?

スペシャライゼーションごとに 1 回。

初期値が違うとどっちが勝つ?

それは、One Definition Rule に違反することになります。このようなプログラムは形式が正しくなく、診断は必要ありません。

于 2013-08-30T05:26:33.273 に答える
-1

を実装するソース ファイルで static メンバを定義しないのはなぜclass Aですか? A.h次に、問題なく複数のソースファイルに含めることができるはずです。

// A.h
class A {
public:
  static int a;
};

// A.cpp
int A::a = 0;
于 2013-08-30T05:26:21.120 に答える