C++のテンプレートクラス宣言ヘッダファイルと実装ファイルの分離後、どのように正常なコンパイルを実現できますか?

1520 ワード

この技術を使うことをお勧めしません!これはほとんどC++のパッチで、基本的にはあなたのプログラムをもっと混乱させるだけです.やむを得ない限り、使わないほうがいいです.以下は具体的な書き方です.
呼び出しファイルが次のように設定されているとします.
// main.cpp#include "foobar.h"intmain(){foobar<int>f;*(f.get())=0;return0;}

ヘッダファイルは次のとおりです.
// foobar.htemplate<typenameT>classfoobar{public:foobar():data(){data=newT;}~foobar(){deletedata;}T*get();//           cpp     private:T*data;};
cpp      :
// foobar.cpp#include "foobar.h"template<typenameT>T*foobar<T>::get(){returnthis->data;}templateclassfoobar<int>;//      

まず、この書き方は互換性が悪く、古いコンパイラではサポートされていない可能性があります.さらに悪いことに、このような書き方はあなたのテンプレートの実現を呼び出し者に依存させます.明示的にインスタンス化された部分を別のヘッダファイルに入れてfoobarにincludeしてもcppの最後の行は、まだ問題があります.このヘッダファイルは異なる上位モジュールに含まれるため、修正するたびに再コンパイルされるコンテンツが大幅に増加します.