6

我想知道是否可以定义模板化的 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);    
}

但这给了我以下错误:错误C2988:无法识别的模板声明/定义

VirtualTPM::CheckTestPoint<T>正确定义了,因为我可以毫无错误地调用a virtual_tpm->CheckTestPoint<int>(name, value);

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

4

3 回答 3

6

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

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

编辑: 未经测试的样本(这应该从 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);
于 2013-10-30T13:51:33.440 回答
1

除了@Jhonny已经指出的内容之外,您还应该能够说:

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

放到标题:

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

和:

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

还要过度使用宏定义以从 c++ 导出:

#if !defined(__cplusplus)
//  ^ Note
#define DLL_Export extern "C" __declspec(dllexport)
#else /* __cplusplus */
#define DLL_Export __declspec(dllexport)
#endif /* __cplusplus */

要查找有关该主题的其他信息,请参阅此链接此链接。

于 2013-10-30T14:00:15.407 回答
1

不确定其他答案是否有效,但我无法使它们起作用。这是应该做的,举个例子(函数模板可以泛化到任何类型的模板函数):

*.hpp

template <typename T>
int randomFunction(T templateElement);

*.cpp

template <typename T>
int randomFunction(T templateElement)
{
    // code...
}
template DLL_EXPORT_IMPORT int randomFunction(float templateElement);
template DLL_EXPORT_IMPORT int randomFunction(double templateElement);
// Any other types you wanna implement...

并且DLL_EXPORT_IMPORT应该在您的库中定义一次,例如:

#ifndef _WIN32
    #define DLL_EXPORT_IMPORT
#elif defined OP_EXPORTS
    #define DLL_EXPORT_IMPORT __declspec(dllexport)
#else
    #define DLL_EXPORT_IMPORT __declspec(dllimport)
#endif
于 2018-11-02T10:44:36.507 回答