Data は Data を初期化して自分自身を一度呼び出す必要があることは知っていますが、実際には何をしているのでしょうか? アクティブ化されているコンストラクターはありますか?
データは、実際には 1 回で自分自身を呼び出しません。これは、内側のデータと外側のデータが 2 つの異なるクラスであるためです。一般に、コンパイラが を見た場合、Data<Data<Point>>
最初に内部部分、つまり を認識しData<Point>
ます。次に、テンプレートをインスタンス化します。つまり、テンプレートによって記述されたプロパティを持つクラスを作成します。Data はクラスではなく、多数のクラスを作成するために使用できるテンプレートであることを理解することが重要です。これらのクラスのそれぞれは、他のクラスとは異なります。それらは異なるタイプであり、相互に実際の関係はありません。Data<Point>
テンプレートの 1 つのインスタンスであり、同じプロパティを持つクラスです。たとえば、
class Foo {
Point dMember;
...
};
私はそれを単にフーと呼びます。次に、コンパイラは をData<Data<Point>>
確認しますが、これはData<Foo>
. テンプレートを再度インスタンス化しますが、今度は Foo (つまり、最初のインスタンス化で取得したクラス) をパラメーターとして使用します。最初のインスタンス化の型のメンバーを持っていることを除いて、原則として最初のクラスから完全に独立した別のクラスを取得します。
class Bar {
Foo dMember;
...
};
それで全部です。データはそれ自体を呼び出しません。データは型として存在しません。初期化で呼び出されるコンストラクターは Bar のコンストラクターであり、Bar のコンストラクターは Foo のコンストラクターを呼び出します。クラス テンプレート内にあるものはすべてテンプレート自体であるため、Data で定義したコンストラクターは実際のコンストラクターではありません。したがって、これはコンストラクター テンプレートであり、Foo や Bar のコンストラクターを呼び出すと、コンパイラーはそのテンプレートを使用して実際のコンストラクターをインスタンス化します。
データは、コンパイラが実際のクラス (および必要に応じてメンバー関数) を構築するための青写真に過ぎず、何かを再生したり、呼び出したり、初期化したりするためにそこに到達することはありません。