我正在通过以下代码片段获得未解析的外部编译错误。
acquire_gray(identity, []{});
当我尝试使用auto
时,会发生同样的事情
auto acquire_callback = [](LPBITMAPINFOHEADER pbi, HANDLE hdib)
{
printf("Callback\n");
};
acquire_gray("", acquire_callback );
但是当我传入null时,它会编译
acquire_gray(identity, NULL);
这是我程序的结构
driver.cpp
#include "bridge.h"
void TB_AcquireImagesStart(HANDLE hNamedPipe, const TB_Message request)
{
acquire_gray("", []{});
}
bridge.h
template<typename T>
void acquire_gray(const string_t& identity, T& callback);
bridge.cpp
template<typename T>
void acquire_gray(const string_t& identity, T& callback)
{
callback();
}
所以我得到的两个例外是
Error 12 error LNK1120: 1 unresolved externals
Error 11 error LNK2019: unresolved external symbol "void __cdecl acquire_gray<class <lambda_e125ff607fe0339bba6077ce9c14d586> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class <lambda_e125ff607fe0339bba6077ce9c14d586> &)" (??$acquire_gray@V<lambda_e125ff607fe0339bba6077ce9c14d586>@@@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAV<lambda_e125ff607fe0339bba6077ce9c14d586>@@@Z) referenced in function "void __cdecl TB_AcquireImagesStart(void *,class TB_Message)" (?TB_AcquireImagesStart@@YAXPAXVTB_Message@@@Z)
所以我的问题是我的代码有什么问题,我该如何解决这个问题,为什么auto
没有检测到我的lambda类型。
答案 0 :(得分:3)
你不能把模板定义放在.cpp中(你可以,但只有你在那个编译单元中使用它们才有意义)。编译后,仅存在模板实例。
答案 1 :(得分:2)
这只是使用模板时常见的陷阱。您不能(或至少不应该)将模板分成标题(.hpp)和源(.cpp)文件。有关详细信息,请参阅here。