使用c++ lambdas的未解析外部

Unresolved externals using C++ lambdas

本文关键字:外部 c++ lambdas 使用      更新时间:2023-10-16

我得到无法解决的外部编译错误与以下代码片段。

acquire_gray(identity,  []{});

当我尝试使用auto

时,同样的事情发生了
  auto acquire_callback = [](LPBITMAPINFOHEADER pbi, HANDLE hdib)
    {
            printf("Callbackn");
    };
   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类型。

您不能将模板定义放在.cpp中(您可以,但只有在该编译单元中使用它们才有意义)。编译后,只存在模板实例化。

这是使用模板时一个常见的陷阱。您不能(或者至少不应该)将模板分成头文件(.hpp)和源文件(.cpp)。