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

C++ 带模板的dllexport函数(C+;+;),c++,templates,dll,C++,Templates,Dll,我想知道是否可以定义一个模板化的dllexport函数。到目前为止,该函数还没有模板化,并且工作正常。代码是这样的: module.cpp: #if defined(__cplusplus) #define DLL_Export extern "C" __declspec(dllexport) #else /* __cplusplus */ #define DLL_Export __declspec(dllexport) #endif /* __cplusplus */ ...

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

module.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);   
}
...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint<T>(name, value);    
}
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);
但是,我需要扩展TestPointModule_Check函数来管理其他数据类型,因此我创建了一个模板化的CheckTestPoint(…)函数,并尝试了以下方法:

module.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);   
}
...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint<T>(name, value);    
}
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);
。。。
模板
DLL\导出void TestPointModule\检查(字符串名称,void*值){
虚拟测试点->检查测试点(名称、值);
}
但这给了我以下错误:错误C2988:无法识别的模板声明/定义

正确定义了
VirtualTPM::CheckTestPoint
,因为我可以调用
virtual\u tpm->CheckTestPoint(名称、值)没有错误


有没有可能的方法来满足我的需求?我可以将模板限制为4种不同的数据类型(事实上,我是在为
VirtualTPM::CheckTestPoint
函数定义模板时这样做的,但我不知道如何做。

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

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

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

模块h:

template <typename T>
DLL_Export void TestPointModule_Check(string name, T * value);
模板
DLL_导出无效测试点模块_检查(字符串名称,T*值);
module.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);   
}
...
template <typename T>
DLL_Export void TestPointModule_Check(string name, void * value){
    virtual_tpm->CheckTestPoint<T>(name, value);    
}
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);
模板
DLL\u导出无效测试点模块\u检查(字符串名称,T*值){
虚拟测试点->检查测试点(名称、值);
}
//显式实例化
模板void TestPointModule_Check(字符串名称,SomeType*值);
除了已经指出的内容,您还应该能够说:

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

要查找有关该主题的其他信息,请参考此项或此项。

不确定其他答案是否有效,但我无法使其有效。这是应该做的,并举例说明(函数模板可以推广到任何类型的模板函数):

*.hpp
中:

template <typename T>
int randomFunction(T templateElement);
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\u EXPORT\u 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

你不能处理未知类型,但它可以处理特定的专门化。我现在迷路了,你能给我一个简单的例子说明如何处理专门化吗?我已经把我认为可以解决的问题放到了一个额外的答案中。我不太明白你说的,你能给我一个简单的例子说明如何处理吗?即使你有一个编译器这允许您将
dllexport
放在模板定义上,您不想这样做,因为这是您无法向您的客户机做出的保证。他们可能会尝试在您的库中没有实例化的类型上实例化,然后他们会得到链接器错误。您好@g-makulik。这很奇怪,但如果我在头部这样做的话er文件:
template DLL\u Export void TestPointModule\u Check(字符串名称,void*value);
这在cpp中:
template DLL\u Export void TestPointModule\u Check(字符串名称,void*value){virtual\u tpm->CheckTestPoint(名称,值);}
我在头文件中得到了相同的错误(错误C2988:无法识别的模板声明/定义)@Iban
T
btw的意义是什么,如果您在任何地方都使用
void*
?您是对的,应该是
TestPointModule\u检查(字符串名称,T*值)
,现在我将函数定义为void*value,只是为了关注我得到的错误,避免出现诸如“T未定义”之类的错误而只是调试你的最新例子也不起作用,每次我输入“代码”>模板DLLILL导出…< /COD> @ IBAN,导出C++函数时,就省略了<代码>外部“C”
在定义
DLL\u Export
宏时。
DLL\u Export\u IMPORT
在您的情况下似乎是无用的:
template\u declspec(dllexport)int random函数(float templateElement)
将始终有效。我猜,您错过了标题中的一种
extern template int random函数(float templateElement)