3

現在公開されている回答を見ても、まだ答えがわかりません。これが私の例です

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

// a.cpp
#include "foo.h"
foo<int> fa;

// b.cpp
#include "foo.h"
foo<int> fb;

// c.cpp
#include "foo.h"
foo<int> fc;

int main (int argc, char* argv[])
{
    fc.t = 5;
}

それは、fa.t と fb.t も 5 ということですか? 構文が正しくない場合はお知らせください。

4

2 に答える 2

5

それは、fa.t と fb.t も 5 ということですか?

はい、staticデータ メンバーはクラスのすべてのインスタンスで共有されます。fafb、およびfcはすべて同じクラスのインスタンスであるためfoo<int>、データ メンバーを共有しstaticます。

オブジェクトのタイプがテンプレートのインスタンスであるという事実は、この問題には関係ありません。また、オブジェクトが異なる翻訳単位でインスタンス化されているという事実も関係ありません。C++11 標準のパラグラフ 9.4/5 では次のように指定されています。

名前空間スコープ内のクラスの静的データ メンバーには、外部リンケージ(3.5) があります。ローカル クラスには、静的データ メンバーがあってはなりません。

つまり、このスニペットは次のようになります。

#include <iostream>

int main ()
{
    fc.t = 5;
    std::cout << fa.t;
}

5標準出力に出力します。これが実際のです。

于 2013-04-04T17:40:14.203 に答える
0

あなたの例ではfa.t、 、fb.tfc.tおよびfoo<int>::tはすべて同じ変数です。しかし、これがあなたが本当に求めているものかどうかはわかりません: foo<int>::tfoo<double>::t異なる変数です。

Pete Becker がコメントで述べたように、クラス テンプレートの各インスタンス化は、非テンプレート クラスとまったく同じように動作するクラスになります。一方、個別のインスタンス化はそれぞれ個別の無関係なクラスであり、独自の静的メンバーがあります。

于 2013-04-04T18:03:38.607 に答える