gpt4 book ai didi

c++ - 为什么这段代码有 C2784 "could not deduce template argument"错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:04 25 4
gpt4 key购买 nike

来自 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::'

为什么会这样?我想通过传入 dValueType 可以推导为 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/

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