c++ - 带模板的 dllexport 函数 (C++)

标签 c++ templates dll

我想知道是否可以定义一个模板化的 dllexport 函数。到目前为止,该功能还没有模板化,并且可以正常工作。代码是这样的:

模块.cpp:

#if defined(__cplusplus)
    #define DLL_Export extern "C" __declspec(dllexport)
#else /* __cplusplus */
    #define DLL_Export __declspec(dllexport)
#endif /* __cplusplus */
...
VirtualTPM * virtual_tpm;
...
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint(name, value);   
}

但是,我需要扩展 TestPointModule_Check 函数来管理其他数据类型,所以我创建了一个模板化的 CheckTestPoint(...) 函数,我尝试了这个:

模块.cpp:

...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint<T>(name, value);    
}

但这给了我以下错误:error C2988: unrecognizable template declaration/definition

VirtualTPM::CheckTestPoint<T>已正确定义,因为我可以调用 virtual_tpm->CheckTestPoint<int>(name, value);没有错误。

有没有办法做我需要的事情?我可以将模板限制为 4 种不同的数据类型(事实上,我在为 VirtualTPM::CheckTestPoint<T> 函数定义模板时这样做了,但我不知道该怎么做。

最佳答案

模板函数在实例化之前不存在。因此,这意味着您只能导出其实例,而不能导出模板本身。

但是如果您将模板定义放在 header 中,您通常可以在其他项目中使用它 - 就像您对仅 header 的库所做的一样。

编辑: 未经测试的示例(这应该从 DLL 导出函数):

模块.h:

template <typename T>
DLL_Export void TestPointModule_Check(string name, T * value);

模块.cpp:

template <typename T>
DLL_Export void TestPointModule_Check(string name, T * value){
  virtual_tpm->CheckTestPoint<T>(name, value);    
}

// explicit instantiation
template void TestPointModule_Check<SomeType>(string name, SomeType * value);

关于c++ - 带模板的 dllexport 函数 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19683935/

相关文章:

php: 加载 oracle 驱动程序给出错误 "Unable to load dynamic library - The specified procedure could not be found."

c# - 如何为动态加载的 native dll 调整 %PATH%?

c++ - 为什么我不能在 C++ 的全局范围内单独声明和定义变量

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 类模板化 std::set 键类型

c++ - 访问修饰符在继承中的不同行为取决于 "this"关键字和模板或缺少它们

java - Tomcat 无法识别 DLL 文件

c++ - 是否可以重用通常的迭代器来构建 const 迭代器?

c++ - 转换运算符和运算符>>

c++ - ITK 不使用 VS 2010 构建