2

次のクラス定義があります

template<typename T>
class Klass {...}

また、以下の2つのインスタンス化があります

Klass<int> i;
Klass<double> d;

KlassのメソッドのコピーはC++コンパイラによっていくつ生成されますか?誰かがそれを説明できますか?ありがとう!

4

2 に答える 2

6

Klassは型ではないので、Klassのメソッドについて話すのは意味がありません。Kalss<int>は独自のメソッドを持つタイプであり、も同様ですKlass<double>。あなたの例では、タイプごとに1セットのメソッドがあります。

実生活で編集してください、それはそれほど単純ではありません。メソッドの実際の存在の問題は、他の要因にも依存します。この質問に対する@KerrekSBの回答を参照してください。

于 2012-05-12T22:38:45.693 に答える
6

各テンプレートインスタンスは、それ自体の完全に別個の、別個の、独立したタイプです。ただし、クラステンプレートメンバー関数のコードは、メンバー関数が特定のテンプレートのインスタンス化に実際に使用されている場合にのみ生成されます(パラメーターのセットに対してテンプレートを明示的にインスタンス化する場合を除く)。特に、これは、一部のクラステンプレートメンバー関数の本体が特定のテンプレートパラメータに対して実際に意味をなさない場合でも、そのメンバー関数を呼び出さない限り、テンプレート全体を使用できることを意味します。メンバー関数がコンパイルされることはありません。

テンプレートは特殊化できることにも注意してください。

template <typename T> struct Foo {
    int bar;
    void chi();
};

template <> struct Foo<int> {
    double bar(bool, char) const;
    typedef std::vector<bool> chi;
    bool y;
};

ご覧のとおり、実際にどのインスタンス化について話しているのかがわかるまで、テンプレート自体からは分からないことがたくさんあります。

于 2012-05-12T22:44:02.550 に答える