2011年9月11日日曜日

テンプレート関数の分割コンパイル

テンプレート関数をヘッダとソースに分割してコンパイルする方法です。

通常、テンプレート関数はヘッダとソースを同じファイルに書きます。分割して書くには、二つの方法があります。

1.ソースファイルをインクルードする

ヘッダファイル内でソースファイルをインクルードします。
参照が循環してしまうので、ソースにもインクルードガード(ifndef〜)を書きます。

ヘッダファイル linktest.h

ソースファイル linktest.cpp

ただし、このようにすると、これを利用する側で常にヘッダとソース両方が必要になってしまいます。

例えばこの方法でビルドしたライブラリをつくります。 そのライブラリを使うクライアント側に、ヘッダだけでなくソースファイルも渡してあげないとインクルードエラーがでます。

2.ソースの最後に個別のクラステンプレートを書く

ソースの最後に個別にクラス指定した関数を書きます。

ヘッダファイル linktest2.h

ソースファイル linktest2.cpp

こちらの場合は1番のようにソースが常に必要となる問題はありません。
しかし、ソースの最後に使う全てのクラスでの組合せを書かないといけないので、ちょっと大変です。上の例ではintとdoubleしか書いていませんが、floatなど必要なものは全て書く必要があります。

参考

1番の方法はこちらを参考にしました。

2番の方法はこちらを参考にしました。



0 件のコメント:

コメントを投稿