带有模板的 dllexport 函数 (C++)

Iba*_*ban 5 c++ dll templates

我想知道是否可以定义模板化的 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>函数定义模板时这样做了,但我不知道该怎么做。

Joh*_*hny 6

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

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

编辑: 未经测试的示例(这应该从 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)