来自 Lambda function passed as parameter我可以编译示例:
template <class Range>
Range FindFirstIf(Range, bool(*Function)(typename Range::ConstReference value));
struct range { using ConstReference = const float&; };
range rng;
rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
当然不能链接,因为 FindFirstIf
没有实现。
然而,当我做了类似的事情时:
template <class Range, class ValueType>
Range MyTest(Range, ValueType, bool(*Function)(ValueType value));
std::vector <int> vi;
double d = 0;
vi = MyTest(vi, d, [](double val) { return (val < 0.0f); });
编译错误:
error C2784: 'Range MyTest(Range,ValueType,bool (__cdecl *)(ValueType))' : could not deduce template argument for 'bool (__cdecl *)(ValueType)' from 'main::'
为什么会这样?我想通过传入 d
, ValueType
可以推导为 double
?
最佳答案
改用它(注意 +
):
vi = MyTest(vi, d, +[](double val) { return (val < 0.0f); });
在某些情况下,Lambda 函数可以退化为函数指针,但它们本身不是函数指针。
换句话说,推导失败是因为它期望在函数指针上工作,但 lambda 不是函数指针,它当然可以转换,但首先必须进行推导,但它不能因为 lambda 不是预期的类型,它可能会衰减到它......等等。
通过在 lambda 前面添加 +
,您可以在将其传递给函数之前强制进行转换,因此 MyTest
会按预期接收实际的函数指针并继续进行推导。
这是一个基于您的代码的最小的工作示例:
#include<vector>
template <class Range, class ValueType>
Range MyTest(Range, ValueType, bool(*Function)(ValueType value)) {}
int main() {
std::vector <int> vi;
double d = 0;
vi = MyTest(vi, d, +[](double val) { return (val < 0.0f); });
}
关于c++ - 为什么这段代码有 C2784 "could not deduce template argument"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40100778/