我想知道是否可以定义模板化的 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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我需要扩展 TestPointModule_Check 函数来管理其他数据类型,所以我创建了一个模板化的 CheckTestPoint(...) 函数,我尝试了这个:
模块.cpp:
...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
virtual_tpm->CheckTestPoint<T>(name, value);
}
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:错误 C2988:无法识别的模板声明/定义
该VirtualTPM::CheckTestPoint<T>定义正确的,因为我可以调用virtual_tpm->CheckTestPoint<int>(name, value);没有错误。
有没有可能的方法来做我需要的?我将能够将模板限制为 4 种不同的数据类型(实际上,我在为VirtualTPM::CheckTestPoint<T>函数定义模板时这样做了,但我不知道该怎么做。
模板化函数在实例化之前不存在。因此,这意味着您只能导出其实例,而不能导出模板本身。
但是,如果您将模板定义放在标题中,您通常可以在其他项目中使用它 - 就像您对仅标题库所做的一样。
编辑: 未经测试的示例(这应该从 DLL 导出函数):
模块.h:
template <typename T>
DLL_Export void TestPointModule_Check(string name, T * value);
Run Code Online (Sandbox Code Playgroud)
模块.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);
Run Code Online (Sandbox Code Playgroud)