多くのテンプレート化されたクラスで構成されるライブラリを処理する必要があります。もちろん、それらはすべてヘッダー ファイルに実装されています。今、コンパイル単位のそれぞれと 1 つにライブラリ全体をほとんど含めなければならないという事実から生じる耐え難いほど長いコンパイル時間を短縮する方法を見つけようとしています。
テンプレートにもかかわらず、前方宣言を使用する可能性はありますか? 以下の例の行に沿って何かを試しています。例として、を回避しようとしましたが、が未定義で#include <vector>
あるため、リンカーエラーが発生しています。push_back
#include <iostream>
namespace std {
template<class T>
class vector {
public:
void push_back(const T& t);
};
}
int main(int argc, char** argv) {
std::vector<int>* vec = new std::vector<int>();
vec->push_back(3);
delete vec;
return EXIT_SUCCESS;
}
$ g++ fwddecl.cpp
ccuqbCmp.o(.text+0x140): In function `main':
: undefined reference to `std::vector<int>::push_back(int const&)'
collect2: ld returned 1 exit status
プリコンパイル済みヘッダーを 1 回試しましたが、コンパイル時間はまったく変わりませんでした (実際のヘッダーではなく、実際に読み込まれたことを確認しました)。しかし、プリコンパイル済みヘッダーを使用するべきだと皆さんがおっしゃるなら、もう一度試してみます。
更新: STL クラスを前方宣言する価値はないと言う人もいます。vector
上記の STL は単なる例であることを強調しておきます。私は実際に STL クラスを前方宣言しようとしているわけではありませんが、それは私が使用しなければならないいくつかのライブラリの、他の重くテンプレート化されたクラスに関するものです。
更新 2:上記の例を実際にコンパイルして適切にリンクする方法はありますか? ローガンは、おそらくでコンパイルされる別のファイルに使用してどこかに-fno-implicit-templates
置くことを提案していますが、それでもリンカーエラーが発生します。繰り返しますが、実際に使用しているテンプレート化されたクラスに適用できるように、それがどのように機能するかを理解しようとしています。template class std::vector<int>
.cpp
-fno-implicit-templates
std::vector