在dll中导出模板类的方法
2013-04-23 10:41
162 查看
假设我们有一个模板类如下:
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,就可以完美的解决模板类导出困难的问题。
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、不同语言混合编程方法、插件等的实现方法)
- 从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)
- .lib和.dll.exe文件的区别和联系,以及导出dll的两种方法
- 获取一个DLL的导出方法列表
- DLL的导出方法 用不用def文件
- C++编译时函数名修饰约定规则和DLL中导出函数的方法
- DLL中导出函数的方法
- 深入浅出Dll( 函数导出、类导出、钓子dll、不同语言混合编程方法、插件等的实现方法)
- 导出DLL 隐藏私有成员变量和成员函数 工厂方法
- VC++编写DLL导出函数及其调用方法
- 导出.net编写的exe/dll文件中Resource的方法
- DLL导出STL模板类和成员变量
- Balon白话MSDN:从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)
- 从普通DLL中导出C++类 – dllexport和dllimport的使用方法
- crt new实现方法,Dll导出函数返回string和动态内存陷阱
- 【PE】查看dll导出的符号的方法以及Depends.exe反汇编工具介绍
- C++ DLL中导出函数的声明的方法
- 获取一个DLL的导出方法列表
- ACCESS,文件下载,DLL操作类,EXCEL导出方法备忘
- VS编译器从DLL导出模板类