社区
工具平台和程序库
帖子详情
一个困惑了我好久的问题,怎样在dll中将一个模板类的实例化类导出,并在客户程序中使用
leafinwind
2003-01-10 02:38:45
一个困惑了我好久的问题,
怎样在dll中将一个模板类的实例化类导出,
并在客户程序中使用
...全文
114
9
打赏
收藏
微信扫一扫
点击复制链接
分享
下载分享明细
分享
举报
写回复
9 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ThinkX
2003-06-03
我在BCB下做过
打赏
举报
回复
赞
firebolt2002
2003-06-03
看看MFC是怎么做的
打赏
举报
回复
赞
wx020101
2003-05-08
up
打赏
举报
回复
赞
todd0
2003-05-08
去看一下 C++TEMPLATE,THE COMPLETE GUIDE 第六章,这一部分在cuj.com上有这一部分的在线文章。里面清楚而详细解释了这个问题。
打赏
举报
回复
赞
hucong
2003-05-07
在dll库到处模板类应该就失去了范型的作用。因为dll是不知道你要具现化什么类型作为参数的模板类呢??及时能导出,那也是在DLL中已经具现化好的模板类
打赏
举报
回复
赞
嵌云阁主
2003-01-13
除了以下这行声明之外
TClassObject<int> intclass;
还要随便加上一个函数(不导出)
void no_use()
{
TClassObject<int> intclass;
intclass.get_Data();
}
在这个函数中调用所有需要导出的函数。
有了这个函数之后,编译器才会生成模板的实现代码,这样就可以导出了。
打赏
举报
回复
赞
leafinwind
2003-01-10
topikachu你好
感谢你给我的回复,问了这么久
这总是给我带来一个点点回音,
虽然不什么希望,呵呵
但是,我还是有一个疑问,
我现在正在试一个Versant的面向对象数据库的软件,
里面有一个对象类的C++联编的问题,
里面通常的方式就是将对象类型直接编译到应用程序中,
这种方式我试过了,可以行的通,
但是用动态库形式提供的时候,
需要动态库中输出对象的类型信息,
改系统使用一个模板类PClassObject<MyClass>,
其中MyClass就是你定义的类,
用你定义的类作为改参数类实例化你的类型信息类
而且要输出该类
动态库曾进跌跌撞撞的编译成功,
类型也输出成功了,
但是客户程序就没有成功的编译通过,
我多块呕血三升而亡了,
有时间还得多多交流,
我的email: leafwin@263.net
打赏
举报
回复
赞
topikachu
2003-01-10
首先模板只有实例化时才生成
所以没有被使用的模板是不会被编译的
其次由于历史和编译器本身的原因,模板实现只能被写在.h文件中被所引用的cpp直接包含。
在新标准中有一个模板编译模型,提供export关键字,可以把模板的实现和接口分别放在cpp和h文件中
但是,由于一定的技术原因,几乎没有编译器提供这种功能。至少我还不知道哪个编译器可以分离式编译
打赏
举报
回复
赞
leafinwind
2003-01-10
这是我的例子,怎么也不成功
<头文件>-----------
//TClassObject.h
#if defined(TEMPLATEDLL_EXPORTS)
#define T_EXPORT __declspec(dllexport)
#pragma message("export")
#else
#define T_EXPORT __declspec(dllimport)
#pragma message("import")
#endif
template<class T>
class TClassObject
{
public:
static T get_Data();
private:
static T m_data;
};
#define TClassObjectExport(className, exportFlag) \
class exportFlag TClassObject< className > { \
public: \
static className get_Data(); \
static className m_data; \
};
TClassObjectExport(int,T_EXPORT)
<实现文件>---------------------------------------------------
template<class T>
T TClassObject<T>::get_Data()
{
return m_data;
}
template<int>
int TClassObject<int>::m_data = 0;
template<int>
int TClassObject<int>::get_Data()
{
return m_data;
}
TClassObject<int> intclass;
<结束>--------------------------------------------------------
dll好像能够生成,但好像什么都没有导出,只有赋值操作被导出
客户程序怎么也没法使用,
这下死的好惨哟
打赏
举报
回复
赞
相关推荐
DLL
导出
实例
化
的
模板
类
因为
模板
是
在
编译的时候根据
模板
参数
实例
化
的,
实例
化
之后就像
一个
普通的
类
(函数),这样才有对应的二进制代码;否则,没有
模板
参数,那么编译器就不知道怎么生成代码,所以生成的
DLL
就没有办法
导出
模板
了.但是根据MSDN的描述,可以
导出
模板
类
的
实例
化
后的代码(注意:这里不是指
实例
化
模板
类
的
一个
对象),比如 template class singleton,那么可以
导出
singleton
DLL
中
使用
模板
类
模板
类
是
一个
编译链接期间才
实例
化
的
类
。只有用到才
实例
化
。标准没有支持对
模板
类
的
导出
,从另外一种意义上来说,
模板
类
的实现全部放
在
头文件
中
,也就不需要
导出
了。但是对于一些特别情况。
模板
类
中
有静态变量和函数。这个时候
DLL
中
使用
的,以及和其他链接这个
DLL
的模块他们是
使用
的两份拷贝。 比如,
在
DLL
中
这样
使用
: T * p
DLL
= Singlton<T>::Get(); 然后再链接这个D...
[百度空间] [原]
DLL
导出
实例
化
的
模板
类
因为
模板
是
在
编译的时候根据
模板
参数
实例
化
的,
实例
化
之后就像
一个
普通的
类
(函数),这样才有对应的二进制代码;否则,没有
模板
参数,那么编译器就不知道怎么生成代码,所以生成的
DLL
就没有办法
导出
模板
了.但是根据MSDN的描述,可以
导出
模板
类
的
实例
化
后的代码(注意:这里不是指
实例
化
模板
类
的
一个
对象),比如 template<typename T> class singleton,那么可以
导出
s...
EXE
中
使用
DLL
的
模板
类
模板
类
是
一个
编译链接期间才
实例
化
的
类
。只有用到才
实例
化
。标准没有支持对
模板
类
的
导出
,从另外一种意义上来说,
模板
类
的实现全部放
在
头文件
中
,也就不需要
导出
了。但是对于一些特别情况。
模板
类
中
有静态变量和函数。这个时候
DLL
中
使用
的,以及和其他链接这个
DLL
的模块他们是
使用
的两份拷贝。 比如,
在
DLL
中
这样
使用
: Environment*
dll
Ptr = Singleton::GetSin
客户程序
中
显式加载
dll
时,如何
使用
dll
中
导出
的
类
客户程序
中
显式加载
dll
时,如何
使用
dll
中
导出
的
类
。 隐士加载时由于客户端程序可以利用
dll
的头文件,所以可以直接用
类
声明
一个
对象,然后再调用
类
中
的方法。可是动态加载时没有头文件阿,怎么
使用
dll
提供的
类
呢
发帖
工具平台和程序库
加入
微信扫一扫
点击复制链接
分享社区
下载分享明细
2.4w+
社区成员
2.7w+
社区内容
C/C++ 工具平台和程序库
社区管理员
申请成为版主
帖子事件
创建了帖子
2003-01-10 02:38
社区公告
暂无公告