6

私はクラスを持っていると言う

template <typename T>
class MyClass
{
    static int myvar;
}

次の課題では何が起こるでしょうか?

MyClass<int>::myvar = 5;
MyClass<double>::myvar = 6;

基準通りにするとどうなるの?MyClass::myvar のバージョンは 2 つですか、それとも 1 つだけですか?

4

3 に答える 3

7

はい、2 つの異なる値を持つ 2 つの変数があります。しかし、それは両者がまったく無関係なクラスだからです。それがテンプレートの仕組みです。それらをクラスと考えないでください。むしろ、クラスを構築するための一連の規則と考えてください。

于 2013-10-09T14:21:10.010 に答える
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 があります。—終わりの例]

于 2013-10-09T14:36:15.767 に答える
1

完全に「新しいクラス」が「各タイプ名」のテンプレートからインスタンス化されます。また、静的メンバーはクラスに関連付けられているため、これらの各クラスには静的変数の独自のコピーがあります。

于 2013-10-09T14:39:16.900 に答える