,但似乎这在 gcc 上不起作用。 有什么原因,为什么这段代码在 gcc 7.4.0 上不起作用,但在 Visu-6ren">
gpt4 book ai didi

c++ - 错误 "lambda is not derived from ' std::function'

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:58:56 26 4
gpt4 key购买 nike

我正在尝试将 lambda 传递给通过可变参数模板定义的 std::function<>,但似乎这在 gcc 上不起作用。

有什么原因,为什么这段代码在 gcc 7.4.0 上不起作用,但在 Visual Studio 2017 上却能正常工作?有没有办法让它在 gcc 上也能工作,而无需先手动将其转换为 std::function<>?

#include <functional>

template<class ...TParams>
int TestFunction(std::function<void(TParams...)> )
{
return 0;
}

void Test()
{
auto fce = [](int /*n*/, double /*d*/) {};

//This doesn't work with error no matching function for call to 'TestFunction<int, double>(Test()::<lambda(int, double)>&)'
TestFunction<int, double>(fce);

//but this works correctly
std::function<void(int, double)> fce2 = fce;
TestFunction<int, double>(fce2);
}

我收到以下错误:

main.cpp: In function 'void Test()':
main.cpp:116:31: error: no matching function for call to 'TestFunction<int, double>(Test()::<lambda(int, double)>&)'
TestFunction<int, double>(fce);
^
main.cpp:106:5: note: candidate: template<class ... TParams> int TestFunction(std::function<void(TParams ...)>)
int TestFunction(std::function<void(TParams...)> fceCallback)
^~~~~~~~~~~~
main.cpp:106:5: note: template argument deduction/substitution failed:
main.cpp:116:31: note: 'Test()::<lambda(int, double)>' is not derived from 'std::function<void(TParams ...)>'
TestFunction<int, double>(fce);
^

最佳答案

尾部模板参数包总是为进一步扣除留有空间。指定前两个参数不会阻止您执行以下操作:

std::function<void(int, double, char)> fce3 ;
TestFunction<int, double>(fce3);

在这种情况下,包将包含 int, double, char,因为 char 是从函数参数推导出来的。现在,因为推导还没有结束,并且 lambda 不是 std::function,替换失败。

要完成这项工作,您需要让推导过程知道它已经结束,现在需要一个实例化函数,然后再给它一个参数。一种方法是获取函数的地址,例如:

auto pfunc = TestFunction<int, double>;
pfunc(fce);

(&TestFunction<int, double>)(fce);

获取函数模板的地址是另一个可能发生模板参数推导的上下文。在这种情况下,尾随包被推断为空,并且您会得到一个指向您可能调用的函数的指针。

关于c++ - 错误 "lambda is not derived from ' std::function',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55675990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com