-qtempinc とは異なり、
-qtemplateregistry コンパイラー・オプションでは、ソース・コードの編成に特定の要件を必要としません。
-qnotempinc で正常にコンパイルできるプログラムなら、
-qtemplateregistry でもコンパイルできます。
テンプレート・レジストリーでは、「先着順」のアルゴリズムが使用されます。
- プログラムが新規のインスタンス生成を初めて参照するとき、そのプログラムのインスタンスは、それが発生するコンパイル単位で生成されます。
- 別のコンパイル単位が同じインスタンス生成を参照すると、そのコンパイル単位のインスタンスは生成されません。つまり、プログラム全体で生成されるコピーは 1 つだけです。
インスタンス生成情報は、テンプレート・レジストリー・ファイルに保管されます。1 つのプログラムでは、同じテンプレート・レジストリー・ファイルを使用しなければなりません。2 つのプログラムで、テンプレート・レジストリー・ファイルを共用することはできません。
テンプレート・レジストリー・ファイルのデフォルトのファイル名は templateregistry ですが、他の有効なファイル名を指定して、このデフォルト名をオーバーライドすることもできます。プログラム・ビルド環境を消去してから新たにビルドを開始する場合は、古いオブジェクト・ファイルとともにレジストリー・ファイルも削除してください。
2 つのコンパイル単位、A と B が同じインスタンス生成を参照する場合、
-qtemplateregistry コンパイラー・オプションを指定すると、次のような影響があります。
- A を最初にコンパイルすると、A のオブジェクト・ファイルにインスタンス生成のコードが含まれます。
- 次に B をコンパイルすると、B のオブジェクト・ファイルにはインスタンス生成のコードは含まれません。オブジェクト A に既に含まれているためです。
- あとで、このインスタンス生成を参照しないように A を変更すると、オブジェクト B の参照に、未解決のシンボル・エラーが発生します。A を再コンパイルすると、コンパイラーはこの問題を検出して、次のように処理します。
- -qtemplaterecompile コンパイラー・オプションが有効であれば、コンパイラーはリンク・ステップ時に自動的に B を再コンパイルして、
A で指定したのと同じコンパイラー・オプションを使用します。(ただし、個別のコンパイル・ステップとリンク・ステップを使用する場合は、リンク・ステップにコンパイル・オプションを組み込んで、
B の正しいコンパイルを確認する必要があります。)
- -qnotemplaterecompile コンパイラー・オプションが有効であれば、コンパイラーが警告を出すので、B を手動で再コンパイルしてください。
-qtemplateregistry コンパイラー・オプションでは、アプリケーションのファイル構造にまったく制限がないため、その管理オーバーヘッドは、-qtempinc より少なくなります。次の方法で、切り替えを行うことができます。
- アプリケーションが -qtempinc でも -qnotempinc でも正常にコンパイルされる場合は、変更する必要はありません。
- アプリケーションが -qtempinc では正常にコンパイルされるが -qnotempinc ではコンパイルされない場合は、
-qnotempinc でも正常にコンパイルされるように、変更する必要があります。個々のテンプレート宣言ファイルに、__TEMPINC__ マクロが定義されていない場合は、対応するテンプレート・インプリメンテーション・ファイルを組み込んでください。-qtempinc の例の図を参照してください。
