静的ライブラリを作成したいC++のクラスがいくつかあります。クラスの1つは、他の2つを使用してオブジェクトを作成するハッシュテーブルクラスです。別の質問への回答で別の小さなデモンストレーションを実行しようとしましたが、私が作成したライブラリは、テストプログラムで作成したものを定義していないようです。私はすべての宣言と実装を単一のファイルで試し、ヘッダー/ソースに分けましたが、配置は重要ではないようです。クラスを静的libHash.aに入れるにはどうすればよいですか?
質問する
543 次
2 に答える
4
コンパイラは新しいインスタンス化を作成できないため、テンプレートをオブジェクト形式で配布することはあまりうまくいきません。ライブラリのユーザーは、ライブラリで定義されたテンプレートのインスタンス化にのみアクセスできます。
そのため、テンプレート クラスと関数は通常、ヘッダー ファイルに実装されます。
テンプレートをヘッダー ファイルにしか実装できないのはなぜですか?も参照してください。
于 2012-05-05T01:05:04.530 に答える
1
テンプレートのインスタンス化をライブラリに配置できますが、テンプレートはヘッダーにある必要があります。インスタンス化するテンプレートの特殊化が事前にわかっている場合は、ヘッダーで明示的なインスタンス化を宣言し、それらの明示的なインスタンス化を.cpp
コンパイルして に定義できます。.a
// hash.h
template<typename T> struct Hash { };
// declare explicit instantiation
extern template class Hash<int>;
// Hash.cpp
#include <Hash.h>
// define explicit instantiation
template class Hash<int>;
ただし、事前に知ることができないインスタンス化の場合 (たとえばHash<SomeOtherPersonsType>
)、インスタンス化できないため、ライブラリに入れることはできません。
于 2012-05-06T17:56:37.583 に答える