我在源文件中本地声明了这个模板函数:
template<typename T>
const std::wstring test(std::function<const std::wstring(T)> f, T arg)
{
return f(arg);
}
我尝试在后续函数中使用它:
auto run = [](const std::string address) -> const std::wstring { return L""; };
test(run, address);
但编译器抱怨它无法推断lambda“run”的模板参数。我做错了什么?
编译器说:
error C2784: 'const std::wstring test(std::function<const std::wstring(T)>,T)' : could not deduce template argument for 'std::function<const std::wstring(T)>' from 'xxx::<lambda_d434160cf17ec6991f6c12a43474f9a9>'
答案 0 :(得分:3)
你需要
std::function<const std::wstring(std::string)> run =
[](const std::string address) { return L""; };
lambda有自己生成的类型(在您的情况下为xxx::<lambda_d434160cf17ec6991f6c12a43474f9a9>
),而auto
,run
保留此类型。另一方面,test
需要std::function<const std::wstring(T)>
。
更简单(也更高效),您可以在函数类型上设置test
模板:
template<typename F, typename T>
const std::wstring test(F f, T arg) { return f(arg); }