无法推导出lambda函数模板参数

时间:2014-05-02 07:06:21

标签: c++ visual-studio-2012

我在源文件中本地声明了这个模板函数:

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>'

1 个答案:

答案 0 :(得分:3)

你需要

std::function<const std::wstring(std::string)> run =
    [](const std::string address) { return L""; };

lambda有自己生成的类型(在您的情况下为xxx::<lambda_d434160cf17ec6991f6c12a43474f9a9>),而autorun保留此类型。另一方面,test需要std::function<const std::wstring(T)>

更简单(也更高效),您可以在函数类型上设置test模板:

template<typename F, typename T>
const std::wstring test(F f, T arg) { return f(arg); }