ウィキペディアの記事には次のように書かれています。
クラス テンプレートをインスタンス化しても、そのメンバー定義はインスタンス化されません。
テンプレートからであろうとなかろうと、そのクラスメンバーもインスタンス化されていないC++のクラスがインスタンス化されるとは想像できませんか?
ウィキペディアの記事には次のように書かれています。
クラス テンプレートをインスタンス化しても、そのメンバー定義はインスタンス化されません。
テンプレートからであろうとなかろうと、そのクラスメンバーもインスタンス化されていないC++のクラスがインスタンス化されるとは想像できませんか?
初期の C++ コンパイラの多くは、呼び出したことがあるかどうかにかかわらず、すべてのメンバー関数をインスタンス化していました。
たとえば、メンバ関数std::list
を持つ を考えてみましょう。現在、適切に機能しているコンパイラを使用すると、比較をサポートしていない型をsort
インスタンス化できます。list
を使用しようとするとlist::sort
、比較がサポートされていないため失敗します。そのsort
リストlist<T>::sort
を呼び出さない限り、呼び出さない限りインスタンス化されないため、すべて問題ありません。
ただし、これらの古い、機能が不十分なコンパイラでは、作成しようとすると、使用list<T>
したことlist<T>::sort
がなくてもインスタンス化されていました。の存在は、そのタイプのリストで実際にまったく使用したことがなくても、を作成するためだけにforlist::sort
を実装する必要があることを意味しました。<
T
list<T>
sort
標準では、(非テンプレートとテンプレートの両方の) メンバー メソッドのインスタンス化は、使用された場合にのみ発生する必要があると明確に述べられています。
C++ 標準からの抜粋 (N3690 - 14.7.1(2) 暗黙的なインスタンス化)
2 クラス テンプレートまたはメンバー テンプレートのメンバーが明示的にインスタンス化または明示的に特殊化されていない限り、メンバー定義の存在を必要とするコンテキストで特殊化が参照されると、メンバーの特殊化は暗黙的にインスタンス化されます。特に、静的データ メンバーの初期化 (および関連する副作用) は、静的データ メンバーの定義が存在することを必要とする方法で静的データ メンバー自体が使用されない限り発生しません。
クラスのメソッドもメンバーです。クラス テンプレート メソッドは、インスタンス化されたクラスに対して呼び出されたときにインスタンス化されます。そのため、これらのメンバー メソッドがインスタンス化されない可能性があります。