c + +从DLL实例化模板类(C++ instantiate template class fro

2019-07-17 19:26发布

我试图让一个包含DLL:

基本模板类 ,只有一个虚析构函数和无属性( 我把它叫做MatrixInterface)

与构造函数,析构函数,操作员=和属性派生类矩阵类

返回一个基类指针到一个新的派生对象的函数:

#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);
}

我想instatiate使用此功能在我的节目矩阵类,但我不能一个函数指针分配给此功能,我不明白为什么。 我可以加载这不是一个模板函数这种方式的任何功能。

#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文件。


能否请你告诉我什么是错我的代码?

Answer 1:

模板仅在编译时解决! 他们将是不同类型的两种不同的编译单位。 (这就是为什么它是非常危险的导出功能与原因std::string作为参数)。

作为consquence你应该明确地实例化模板的类型,你要使用/允许使用。

在你exportimport.h文件,应该有你要在你的DLL中暴露类型的模板instanciation。 即MatrixInterface<int>

你应该写:

template class MatrixInterface<int>;

以便露出一个且只有一个类型。 比照 是什么`类模板实施例<int>的;`语句C ++ 11是什么意思?

看看文档参考这里: https://en.cppreference.com/w/cpp/language/class_template#Class_template_instantiation



文章来源: C++ instantiate template class from DLL