• 在dll中导入模板类与模板函数


    假设我们有一个模板类如下:

    template< class T >

    class CArray

    {

    public:

    CArray();

    private:

    T *m_pData;

    }

    template< class T >

    CArray< T >::CArray() { m_pData = NULL; }

     

    模板函数如下:

    template

    void Swap(T& tNum1, T& tNum2)
    {
     T tTmp;
     tTmp = tNum1;
     tNum1 = tNum2;
     tNum2 = tTmp;
    }
    #define ALGORITHM_DLL __declspec(dllimport)
    #else //EXPORT
    #define ALGORITHM_DLL __declspec(dllexport)
    ALGORITHM_DLL void Swap(T& tNum1, T& tNum2)
    {
    T tTmp;
    tTmp = tNum1;
    tNum1 = tNum2;
    tNum2 = tTmp;
    }
    #define ALGORITHM_DLL __declspec(dllimport)
    #else //EXPORT
    #define ALGORITHM_DLL __declspec(dllexport)
    ALGORITHM_DLL void Swap(T& tNum1, T& tNum2)
    {
    T tTmp;
    tTmp = tNum1;
    tNum1 = tNum2;
    tNum2 = tTmp;
    }

    如果在dll中包含了该模板类,要是不导出的话,当别的dll工程使用该模版类作为成员变量时,编译就会出现出现警告,提示该模板类及模板函数没有导出供客户端程序使用。如果按通常的dll接口导出方式导出:

    #ifndef ALGORITHM_EXPORTS

    #endif

    template< class T >

    class ALGORITHM_DLL CArray

    {

    public:

    CArray();

    private:

    T *m_pData;

    }

    template< class T >

    CArray< T >::CArray() { m_pData = NULL; }

     

    template

    当其他程序通过dll调用该模版类或模板函数的时候,编译又会报错,提示写在模版类声明外面的函数不能__declspec(dllimport)。如果把模版类声明外面的函数写到模板类声明里面去实现,编译可以通过,而在链接时又会出错,提示导出的模板类的函数是无法解析的外部符号。总之,用通常的方法都会产生问题,这是因为模板类是动态编译的,它并不参与dll的编译,只会在使用它的程序中才编译,而在使用它的程序中又不允许导入模板类。

    为了解决这个问题,只能从导出宏的定义上动手。如果对dll该模板类(或模板函数)是__declspec(dllexport)而对其他程序既不导出也不导入,就可以避免上述的错误。因此程序可以修改为:

    #ifndef ALGORITHM_EXPORTS

    #define ALGORITHM_TEMPLATE

    #define ALGORITHM_TEMPLATE __declspec(dllexport)

    #endif

    template< class T >

    class ALGORITHM_TEMPLATE CArray

    {

    public:

    CArray();

    private:

    T *m_pData;

    }

    template< class T >

    CArray< T >::CArray() { m_pData = NULL; }

     

    template

    如上所述,只要对模版类使用ALGORITHM_TEMPLATE宏而不使用ALGORITHM_CLASS,就可以完美的解决模板类导出困难的问题。

  • 相关阅读:
    python排序
    python中常用的九种数据预处理方法分享
    8089汇编 源程序
    8086汇编 栈操作
    8089汇编 运算符指令
    8089汇编 标志寄存器
    8086汇编 段寄存器
    8086汇编 Debug 使用
    8086汇编 CPU 寄存结构
    8086汇编 内存交互
  • 原文地址:https://www.cnblogs.com/zfluo/p/5131848.html
Copyright © 2020-2023  润新知