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中导出模板函数?
如何声明、定义该函数?
...全文
213 11 打赏 收藏 转发到动态 举报
写回复
用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中不能导出模板函数。
在编译时,编译器必须决定函数参数的内存结构大小,所以不可能生成模板函数。

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧