0

次の問題があります。次のようなテンプレートクラス定義を使用して、C++でDLLを作成しました。

 template <class T>
 class myClass {
    public:
    //! Constructor
    myClass(int size = 10);

    //! Destructor
    ~myClass();

    someAttributes ... ;
    }

エクスポートしたいので、次のように定義しました。

   template class __declspec(dllexport) myClass<double>;

なぜなら-私が読んだ-VisualC++では、テンプレートをエクスポートすることはできず、明示的な初期化のみを行うことができます。このようにしてすべてが正常に機能し、DLLを新しいVisualC++コードにインポートできます。今:必要なすべてのタイプ(myClass、myClassなど)の明示的なインスタンス化をエクスポートする必要がありますか?それとも、それを行うためのより良い方法がありますか?テンプレートクラスをVB.NETプロジェクトにインポートするにはどうすればよいですか?方法はありますか?または、マーシャリング構造を作成し、実行時にテンプレートクラスで変換する必要がありますか?

皆さん、ありがとうございました!

4

1 に答える 1

1

使用する型ごとに、テンプレートの明示的な型のインスタンス化をエクスポートする必要があります。さらに、オブジェクト コードをライブラリに含めるために、C++ コードから明示的に使用する各メソッドを少なくとも 1 回呼び出す必要がある場合があります。

これは、テンプレート コードがオブジェクト ファイル (または dll) にすぐにコンパイルされるコードではないためです。コンパイラは、プログラムのコンパイル時に必要な (通常は必要なコードのみ) コードを生成します。C++ コードがテンプレート クラスをまったく使用しない場合、コンパイラはテンプレートをまったく無視します。テンプレート クラスのメソッドについても同様です。使用しない場合、コンパイラはそれを無視できます。

要するに、他の言語から使用することを意図したライブラリのテンプレート コードを使用することは、通常、あまり良い考えではありません...

于 2012-09-18T14:06:22.990 に答える