1

静的ライブラリを作成したいC++のクラスがいくつかあります。クラスの1つは、他の2つを使用してオブジェクトを作成するハッシュテーブルクラスです。別の質問への回答で別の小さなデモンストレーションを実行しようとしましたが、私が作成したライブラリは、テストプログラムで作成したものを定義していないようです。私はすべての宣言と実装を単一のファイルで試し、ヘッダー/ソースに分けましたが、配置は重要ではないようです。クラスを静的libHash.aに入れるにはどうすればよいですか?

4

2 に答える 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 に答える