パソコン・メモメモ備忘録

気の向くままパソコン関係等で気になることを書き記す。時々更新!

テンプレート関数の明示的な実体化

実体化は、インスタンシエーションとかインスタンス化とかとも呼ばれたりする。

テンプレートクラスのメソッドや普通のクラスのテンプレートメソッドの宣言を .h、実装を .cpp ファイルに分けて書いたりすると、ちょっと困ったことが起こる場合がある。そのメソッド(関数)の実体が生成されず、リンク時に、そんな関数はないぞー、とエラーになる。

他の .cpp ファイルでしか、ある上記のメソッドを使っていない場合、.h ファイルは勿論インクルードするが、その中には実装はないので、そのメソッドに対する実際のコードを生成はできない。その実装が含まれた .cpp ファイルの中でしかコードを生成できない、ということ。

.cpp ファイル内にダミーのグローバルメソッドでも作って、その中で そのメソッドを呼ぶコードを書いたりしてもいいのかもしれないが、一応きちんとした書き方がある。

template NankaTemplateClass::method(Honya honya, ....);

template NankaClass::TemplateMethod(Honya honya, ....);
と書いておけば、そこで実際のコードが生成されて、リンクも成功する、ということらしい。template の後ろに<> を書かないのがミソ。

もちろん、.h の中に、宣言も実装も書いておけば、こういう苦労はいらないのだが。インクルードの依存関係とかも考えると、実装を .cpp に分けたいこともあるだろうし、覚えておいた方がいいかと思われる。

C++ で普通にプログラミングしている人には、基本中の基本なんだろうか...

あ、テンプレートクラスの場合は、個別のメソッドごとではなくて、クラス丸ごと実体化すればいいのかな。