私はクラスを持っていると言う
template <typename T>
class MyClass
{
static int myvar;
}
次の課題では何が起こるでしょうか?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
基準通りにするとどうなるの?MyClass::myvar のバージョンは 2 つですか、それとも 1 つだけですか?
私はクラスを持っていると言う
template <typename T>
class MyClass
{
static int myvar;
}
次の課題では何が起こるでしょうか?
MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;
基準通りにするとどうなるの?MyClass::myvar のバージョンは 2 つですか、それとも 1 つだけですか?
はい、2 つの異なる値を持つ 2 つの変数があります。しかし、それは両者がまったく無関係なクラスだからです。それがテンプレートの仕組みです。それらをクラスと考えないでください。むしろ、クラスを構築するための一連の規則と考えてください。
OPは具体的に標準からの引用を要求したため、標準からの関連する引用を含む私の回答を次に示します。
各専門化には独自のコピーがあり、それぞれが独自の個別のクラスmyvar
であるため、意味があります。セクションテンプレートのインスタンス化と特殊化のパラグラフ6のC ++ドラフト標準は次のように述べています(強調鉱山):14.7
テンプレートからインスタンス化された各クラス テンプレートの特殊化には、静的メンバーの独自のコピーがあります。
[ Example: template<class T> class X { static T s; }; template<class T> T X<T>::s = 0; X<int> aa; X<char*> bb;
X には int 型の静的メンバー s があり、X には char* 型の静的メンバー s があります。—終わりの例]
完全に「新しいクラス」が「各タイプ名」のテンプレートからインスタンス化されます。また、静的メンバーはクラスに関連付けられているため、これらの各クラスには静的変数の独自のコピーがあります。