2009-03-20 16 views
7

dll初心者のために、私は全力を借りて何かについて尋ねなければなりません。私は再び輸入にこのテンプレートクラスを使用するにはどうすればよい明示的にインスタンス化されたテンプレートクラスをdllからインポートする

template class __declspec(dllexport) B<int>; 

は、私が明示的に次のようにテンプレートクラスをインスタンス言いますか?

私はあなたが完全にテンプレートをインスタンス化するとB

template class __declspec(dllimport) B<int>; 
+0

"Bを使用したい私の.cppファイルに下記のコードを追加しようとしましたが、何を発見しましたか?間違いをしましたか?何が起こったのか、それをあなたの質問に入れることができますか? –

答えて

4

を使用したい私の.cppファイルで以下のコードを追加しようとした - あなたは完全な型を持っています。それは他のどのタイプとも変わりません。 Bのヘッダーとコンパイル時のリンクをlibファイルに含めたり、dllを動的にロードして定義にリンクする必要があります。

この記事をお読みですか?http://support.microsoft.com/kb/168958

ここで私がテストした(そして、それは働いていた)何の簡単な要約があります:


ダミーDLLプロジェクトを作成します

  • は/ DLLヘッダを生成するために、Win32コンソールアプリケーションウィザードを使用しますソースファイルはtemplate_export_test
  • 以下を追加しました:

ファイル:template_export_test.h


#ifndef EXP_STL 
#define EXP_STL 
#endif 

#ifdef EXP_STL 
# define DECLSPECIFIER __declspec(dllexport) 
# define EXPIMP_TEMPLATE 
#else 
# define DECLSPECIFIER __declspec(dllimport) 
# define EXPIMP_TEMPLATE extern 
#endif 

EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>; 

ファイル:template_export_test.cpp


template<class T> 
CdllTest<T>::CdllTest(T t) 
: _t(t) 
{ 
    std::cout << _t << ": init\n"; 
} 

は、テストアプリケーションを作成します。

  • と呼ばれるWin32コンソールアプリケーションを作成するためのウィザードを使用します。driver
  • 編集このプロジェクトのリンカのプロジェクト設定:リンカ>一般>追加のライブラリディレクトリに追加
    • :パスtemplate_export_test.lib
    • にします
    • は、リンカ>入力>追加の依存に追加:template_export_test.lib
  • は、メインのCPPファイル内template_export_test.h

#include "c:\Documents and Settings\...\template_export_test.h" 
using namespace std; 

int main(int argc, char** argv) { 
    CdllTest<int> c(12); 
} 

  • コンパイルを含めると行きます!
+0

私は試しました: externテンプレートクラス__declspec(dllimport)B ; 動作しませんでした。 – Nailer

+0

リンクありがとうございます。しかし、私はあなたのサンプルが正しく動作しないと思います。 #ifndef EXP_STL #define EXP_STLが正しくありません。あなたが提供したリンクと一貫していません。 –

0

テンプレートを明示的にインストールしても、ランタイムエラーにつながる問題が発生する可能性があります。 this interesting article to C4251(特に「結論」)をご覧ください。