社区
进程/线程/DLL
帖子详情
dll中不能导出模板函数?
heartwell
2003-09-24 11:35:40
template <typename T>
extern "C" _declspec(dllexport) BOOL DoFirst(T time);
编译无法通过,提示:error C2059: syntax error : 'string'
请问,该如何在dll中导出模板函数?
如何声明、定义该函数?
...全文
235
11
打赏
收藏
dll中不能导出模板函数?
template extern "C" _declspec(dllexport) BOOL DoFirst(T time); 编译无法通过,提示:error C2059: syntax error : 'string' 请问,该如何在dll中导出模板函数? 如何声明、定义该函数?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
heartwell
2003-09-26
打赏
举报
回复
关键问题就在dll中没有主调函数,编译器无法确定其最终类型,OK,结贴了,在失败中学习,谢谢各位了~
shiquan
2003-09-26
打赏
举报
回复
哈哈,我感觉好有意思。
我理解的模板的运作是这样的,也许不对:由于我们总为了适应各种参数类别而写大量的重复代码(int main(int x){};int main(float x){};...)。所以c++编译器说:"这么办吧!你先给我个记号,用它代替类型,等你写实现时把真正的类型用'<'和'>'括起来。到那时我再把真正的函数写出来,你用过多少种类型的函数,我就声称多少中的函数。这样就可以解决写一大堆一模多样的函数的问题了,这下大家满足了吧??”
...
没有,肯定没有。搂主就没满足。JJ(just a joke).
所以说我觉得就算能导出,一样用不了。
个人观点,如果不对,请指正。
ac1998
2003-09-26
打赏
举报
回复
楼上的,当然,否则DLL没办法处理函数的栈。
heartwell
2003-09-25
打赏
举报
回复
比如,我希望在一个工程中使用dll中的一个函数,需要满足任意类型的参数传递,可能在工程中第一次调用时传递的是一个int类型参数,第二次调用传递的是一个自定义结构体类型参数,当我使用显式链接dll获取函数名的时候,是不能确定其参数类型的?也就是说只能在dll中编辑多个重载版本?那么就是说,是无法在dll中导出模板函数的?
SolidEst
2003-09-25
打赏
举报
回复
为编译项目创建一个.def文件然后加入
EXPORTS
DoFirst
然后编译即可
但编译后dll内的函数名为DoFirst和extern "C"的效果一样
但此时DoFirst不是模板函数了,而是具有实际类型参数的函数
SolidEst
2003-09-25
打赏
举报
回复
创建一个.def文件然后加入
EXPORTS
DoFirst
JoeRen
2003-09-25
打赏
举报
回复
“通过函数名显式链接dll”?对于模板函数,你有这样的需求?这是令人惊奇的。
模板函数并不是只有一个版本。如果有多个模板函数的实例,你想通过函数名显式连接的是哪一个版本呢?如果你能搞清楚这个问题,就应该知道如何解决了。
heartwell
2003-09-25
打赏
举报
回复
那么就是说无法从dll中导出参数类型不定的函数了?
JoeRen
2003-09-25
打赏
举报
回复
我不太清楚你的“显式连接Dll”是什么,假定它是指动态连接GetProcAddress的话,那么你提供给GetProcAddress的只有一个孤零零的函数名称(特别是这个名称还是extern "C"的,根本不可能提供任何类型信息)。那你要怎样辨别要取的是哪一个重载函数呢?
extern"C"的函数能传递的信息非常有限。如果它是使用C调用约定的话,只能传递名称。如果使用Pascal调用约定(现在叫做标准调用约定)的话还可以传递参数个数。这样的话,DLL要使用extern"C"导出重载函数都有点困难,更不要说模板函数了。
heartwell
2003-09-24
打赏
举报
回复
但是如果去掉extern "C" 似乎就没有这个问题了,extern "C"只是用来防止编译器改变函数名字,如果去掉就能通过编译,那么似乎就不是dll不可以生成模板函数了。但是,如果去掉了extern "C",就无法通过函数名显式链接dll了,请问有什么方法?
SolidEst
2003-09-24
打赏
举报
回复
模板的实质是类型安全的宏。所以dll中不能导出模板函数。
在编译时,编译器必须决定函数参数的内存结构大小,所以不可能生成模板函数。
模板
函数
/类
不能
导出
到动态链接库(
DLL
)
该文章转自http://hi.baidu.com/htvhsztnrubhxze/item/f98427fd02fd2718e3e3bd79
模板
函数
在声明的时候, 其实并不存在,
函数
地址也就无从谈起了,而
导出
到动态链接库的
函数
都需要有地址,也就是说——
函数
模板
不具备
导出
的基本条件。
函数
模板
在调用时后,有了具体的实现,这个时候才有了地址。 如果要
导出
,必须将参数类型列表具体化,比如说,有这么一个
模板
:
C++关于
DLL
导出
模板
类和
模板
函数
这两天写了个
Dll
,要
导出
普通类
中
的
模板
函数
,稍微查了一下,没查到具体资料。自己根据C++
模板
的编译原理,推断出应该要源码放在头文件
中
直接
导出
,查了下接触的Open Source项目,确实如此。这里记录一下,方便下次查阅。 1、宏定义说明: #ifdef
DLL
_PROJECT #define TEMPLATE_IM_EXPORT __declspec(
dll
export) #else #define TEMPLATE_IM_EXPORT #endif #ifdef
DLL
_PROJECT #de
用dumpbin来查看
dll
导出
了哪些
函数
(接口)。尤其是观察
导出
的那个类继承自
模板
(实例化了
模板
后再
导出
)
用dumpbin来查看
dll
导出
了哪些
函数
(接口)。尤其是观察
导出
的那个类继承自
模板
(实例化了
模板
后再
导出
)
从
DLL
(动态库)或Lib(静态库)
中
导出
模板
函数
最近有个C++项目有这样一个的需求,一些结构体对象需要 序列化/反序列 操作。我采用了 Boost库
中
的 序列化功能,一个不太好的情况是,其它同事的机器上并安装Boost 开发库,所以,我决定将这部分 对象序列化的功能封装到 一个库
中
,提供给其他同事使用。问题在此时出现,因为要序
模板
类
模板
函数
导出
DLL
模板
类
模板
函数
导出
DLL
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章