美文网首页
[转]在dll中导出模板类的方法

[转]在dll中导出模板类的方法

作者: 散夜霜 | 来源:发表于2018-01-18 11:09 被阅读0次

文章来源
其实也没啥用,因为头文件包含了定义,代码无法隐藏

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

template< class T >
class CArray
{
public:
    CArray();
private:
    T *m_pData;
}

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

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

#ifndef ALGORITHM_EXPORTS
  #define ALGORITHM_CLASS __declspec(dllimport)
#else //EXPORT
  #define ALGORITHM_CLASS __declspec(dllexport)
#endif

template< class T >
class ALGORITHM_CLASS CArray
{
public:
    CArray();
private:
    T *m_pData;
}
template< class T >
CArray< T >::CArray() { m_pData = NULL; }

当其他程序通过dll调用该模版类的时候,编译又会报错,提示写在模版类声明外面的函数不能__declspec(dllimport)。如果把模版类声明外面的函数写到模板类声明里面去实现,编译可以通过,而在链接时又会出错,提示导出的模板类的函数是无法解析的外部符号。总之,用通常的方法都会产生问题,这是因为模板类是动态编译的,它并不参与dll的编译,只会在使用它的程序中才编译,而在使用它的程序中又不允许导入模板类。
为了解决这个问题,只能从导出宏的定义上动手。如果对dll该模板类是__declspec(dllexport)而对其他程序既不导出也不导入,就可以避免上述的错误。因此程序可以修改为:

#ifndef ALGORITHM_EXPORTS
#define ALGORITHM_CLASS __declspec(dllimport)
#define ALGORITHM_TEMPLATE
#else //EXPORT
#define ALGORITHM_CLASS __declspec(dllexport)
#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; }

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

相关文章

  • [转]在dll中导出模板类的方法

    文章来源其实也没啥用,因为头文件包含了定义,代码无法隐藏 假设我们有一个模板类如下: 如果在dll中包含了该模板类...

  • C++编写dll与调用

    重要参考 c++ dll编写与加载;C++编程笔记:dll的生成与使用;8.DLL导出C++类; 在 Visual...

  • 15.工厂方法模式

    在模板方法模式中,在父类(抽象类)中定义流程,将具体实现交由子类实现,如果将模板方法模式用于生成实例对象,那么模板...

  • 16.桥梁模式

    在模板方法模式中,在父类(抽象类)中定义流程,将具体实现交由子类实现,如果将模板方法模式用于生成实例对象,那么模板...

  • 抽象类的一个问题

    创建一个基类,让它包含抽象方法print(),并在导出类中覆盖该方法,覆盖后的方法版本可以打印导出类中定义的某个整...

  • 模板方法模式

    什么模板方法? 在抽象类中定义一个方法模板,将确定的方法放入抽象类中实现,抽象不确定的方法由子类继承实现。 示例场...

  • 图解设计模式之Template Method模式

    什么是 Template Method模式 Template Method即模板方法,组成模板的方法被定义在父类中...

  • POI流式导出Excel

    需要的pom依赖 一、Excel模板导出,不是数据导出(导出是带着限制条件的空Excel) (PS:工具类在最下面...

  • 14/8

    类模板 1.模板声明 2.在cpp中方法上添加template 3.在方法限定符中添加模板...

  • [设计模式]一文读懂模板方法

    模板方法 定义: 在模板方法中,有一个公共的抽象类声明了一个模板方法,其中包括: 必定会执行的模板方法,子类无法实...

网友评论

      本文标题:[转]在dll中导出模板类的方法

      本文链接:https://www.haomeiwen.com/subject/xcwioxtx.html