3

以下を含むDLLを作成しようとしました。

基本テンプレートクラス、仮想デストラクタのみを含み、属性はありません(私はこれをMatrixInterfaceと呼びました

コンストラクタ、デストラクタ、operator =および属性を持つ派生クラス(行列クラス

新しい派生オブジェクトへの基本クラスポインタを返す関数:

#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

template<class T>
MatrixInterface<T> DLL_EXPORT * CreateMatrixInstance(unsigned int n,unsigned int m)
{
    return new matrix<T>(n,m);
}

この関数を使用してプログラムの行列クラスをインスタンス化したかったのですが、この関数に関数ポインターを割り当てることができず、その理由がわかりません。この方法で、テンプレート関数ではない関数をロードできます。

#include <windows.h>
#include <iostream>
using namespace std;

template<class T>
class MatrixInterface
{
public:
    virtual ~MatrixInterface(void);
};


typedef MatrixInterface<int>* (*Fptr)(unsigned int,unsigned int);

int main(int argc, char* argv[])
{
    Fptr p;
    MatrixInterface<int> *x;
    char path[]="basicmatrix.dll";
    HINSTANCE hDll = LoadLibrary(path);
    cout<<(char*)path<<endl;
    if(hDll)
    {
        cout<<"Library opened succesfully!"<<endl;
        p = (Fptr)GetProcAddress(hDll,"CreateMatrixInstance");
        if(p) {
            cout<<"working!\n";
            x=p(7,8);
            cout<<"MatrixCreated"<<endl;
            delete x;

        } else {
            cout<<"Failed loading function CreateMatrixInstance\n";
        }
    }
    else
    {
        cout<<"Failed loading library "<<(char*)path<<endl;
    }
    system("pause");
    FreeLibrary(hDll);
    return 0;
}

基本クラスは、DLLと実行可能ファイルの両方に存在します。


何らかの理由で、Visual StudioはDLL(MSVCまたはMinGWでコンパイルされた)を開くことができません。MinGWでプログラムをコンパイルすると、.dllファイルが読み込まれます。


私のコードの何が問題になっているのか教えていただけますか?

4

1 に答える 1

12

テンプレートはコンパイル時にのみ解決されます!そして、それらは2つの異なるコンパイルユニットで異なるタイプになります。(これが、パラメーターとして関数をエクスポートすることが非常に危険である理由std::stringです)。

結果として、使用する/使用を許可するタイプにテンプレートを明示的にインスタンス化する必要があります。

ファイルにexportimport.hは、dllで公開するすべてのタイプのテンプレートインスタンス化が含まれている必要があります。つまりMatrixInterface<int>

あなたは書くべきです:

template class MatrixInterface<int>;

唯一無二のタイプを公開するために。cf. `class template Example<int>;`ステートメントはC++11で何を意味しますか?

こちらのドキュメントリファレンスを参照してください:https ://en.cppreference.com/w/cpp/language/class_template#Class_template_instantiation

于 2013-01-03T12:06:22.763 に答える