半明示的インスタンスの場合、インスタンスは、明示的にインスタンス化されるテンプレートやテンプレート本体の中で暗黙的にインスタンス化されるテンプレートに対してのみ生成されます。main コード行内で行う暗黙的なインスタンス化は不完全になります。インスタンスは現在のコンパイル単位に置かれます。したがって、テンプレートは再コンパイルごとに再インスタンス化され、テンプレートレポジトリには保存されません。
明示的インスタンスは大域リンケージを受け取ります。これらのインスタンスは、現在のコンパイル単位の外でも認識でき、使用できます。同じプログラムで複数の明示的インスタンス化があると、リンカーで複数のシンボル定義エラーになります。したがって、半明示的インスタンスは、明示的なインスタンス化によってライブラリを構成する場合のように、明示的インスタンスが繰り返されないことがわかっている場合にだけ適しています。
明示的インスタンスの本体内から使用される暗黙的インスタンスは、静的リンケージを受け取ります。これらのインスタンスは現在のコンパイル単位の外では認識できません。そのため、テンプレートの同じインスタンス化がいくつかのオブジェクトファイルに存在することがあります。これには、次の 2 つの欠点があります。
複数のインスタンスによって不必要に大きなプログラムが生成されます (したがって、半明示的インスタンスのリンケージは、テンプレート本体で複数のインスタンス化が起こらないプログラムだけに適しています)。
静的変数を持つテンプレートにはその変数のコピーがたくさんあります。これは必然的に C++ 標準に違反することになります。したがって、半明示的インスタンスはテンプレート内の静的変数には使用できません。
半明示的インスタンスは、-instances=semiexplicit オプションで指定します。
半明示的インスタンスリンケージは、定義取り込み型テンプレート編成でのみ使用できます。コンパイラは定義を検索しません。