彼らがする必要があるとして、使用するあなたのDLLを使用してそのコードをファイル__declspec(dllimport)を使用してください。
したがって、特定の他の定義が設定されている場合はdllexportを使用するマクロを作成し、そうでない場合はdllimportを作成する必要があります。どこか共通ヘッダで
:含まれるヘッダ内
extern template class FOO_API Templ<MyClass, int >;
:
#ifdef EXPORTING_FOO
#define FOO_API __declspec(dllexport)
#else
#define FOO_API __declspec(dllimport)
#endif
あなたは、テンプレートをインスタンス化することができます。ここにexternを書き留めておきます。 1つのコンパイル単位内 は、このように、同じですが、にexternなしとFOO_APIなしを宣言:
template class Templ<MyClass, int >;
これはあなたのライブラリーを使用してコードがテンプレートをインスタンス化しないことを意味しますが、あなたのライブラリ内のものを使用することになります。これは、テンプレートに仮想メンバーがある場合に特に便利です。
テンプレートが標準ライブラリまたはブーストのものであれば、あなたのコードを使用しているコードは、あなたと同じバージョンを使用しなければならないか、深刻な問題が発生する可能性があります。
独自の例では、プライベート領域に表示されていることから、ライブラリのインターフェイスからリファクタリングすることが示唆されています。理想的には、ライブラリは公開宣言以外のパブリックメソッドとメンバーのみを公開する必要があります。プライベートなコピーコンストラクタと代入は、クラスをコピー不可と割り当て不可能にするためには問題ありません。クラスのインターフェイスの一部である実装の一部ではありません(コピーや割り当てができないと言っています)。
それは私が2010年にそれをやり直すために使用した方法ですが、今は実際にはすべてのプロジェクトソースに含まれていて外部ユーザーソースではなく、FOO_APIなどを定義するstdafx.hファイルなどがあります。ヘッダーは単に#ifndef FOO_APIを実行し、#pragma commment libも行います。 – CashCow