複数のファイルにまたがるテンプレートを宣言する場合、C++はかなり不機嫌そうです。より具体的には、テンプレート化されたクラスを操作する場合、リンカは単一のコンパイラオブジェクトファイル内のクラスのすべてのメソッド定義を期待します。ヘッダー、他の宣言、継承などを考慮すると、物事は本当に厄介になります。
テンプレート化されたメンバー定義を複数のファイルに整理または再配布するための一般的なアドバイスや回避策はありますか?
テンプレート化されたメンバー定義を複数のファイルに整理または再配布するための一般的なアドバイスや回避策はありますか?
はい; しないでください。
C ++仕様では、コンパイラーはインスタンス化の時点でテンプレート全体(宣言と定義)を「見る」ことができ、(実装の複雑さのために)ほとんどのコンパイラーはこの要件を保持します。結果として、テンプレートヘッダーを含めるには、テンプレートをインスタンス化するために必要なすべてのソースを含める必要があります。
これに対処する最も簡単な方法は、すべてをヘッダーにダンプし、可能な場合はインラインで、必要な場合はオフラインにすることです。
これを実際に容認できない侮辱と見なす場合、一般的なオプションは、テンプレートを通常のヘッダーと実装のペアに分割し、ヘッダーの最後に実装ファイルを#includeすることです。
C ++の「エクスポート」機能は、別の回避策を提供する場合と提供しない場合があります。この機能は十分にサポートされておらず、定義も不十分です。原則として、テンプレートのある種の個別のコンパイルを許可する必要がありますが、コンパイラがテンプレート本体全体を表示できるという要求を必ずしも排除するわけではありません。
いくつのファイルにまたがって?クラス定義を実装から分離したいだけの場合は、C++のよくある質問でこの記事を試してください。これが現時点で機能することを私が知っている唯一の方法ですが、一部のIDE(Eclipse CDTなど)はこのメソッドを適切にリンクせず、多くのエラーが発生する可能性があります。ただし、独自のmakefileを作成したり、Visual C ++を使用したりすることは、常に私にとってはうまくいきました:-)
コンパイラが C++0x をサポートしている場合は、extern
キーワードを使用してテンプレート宣言を定義から分離できます。
簡単な説明については、こちらを参照してください。
また、 C++ Templates: The Complete Guideのセクション 6.3「The Separation Model」では、David Vandevoorde と Nicolai M. Josuttis による他のオプションについて説明しています。