【发布时间】:2014-09-11 18:07:26
【问题描述】:
我有以下功能:
template <typename Range>
Range FindFirstIf(Range rng, bool (*Function)(typename Range::ConstReference value))
对于这个函数,我试图传递一个像这样的 lambda 函数:
rng = FindFirstIf(rng, [](const float& val) { return (v < 0.0f); });
其中rng 是浮点列表的范围,因此Range::ConstReference 定义为const float&
我的编译器 (gcc) 抱怨类型不匹配
C:\Programming\Collections\main.cpp|24|note: mismatched types 'bool (*)(typename Range::ConstReference)' and 'main(int, char**)::< lambda(const float&) >'|
谁能告诉我我的代码有什么问题?
编辑:
当我像这样传递函数时,它可以工作:
bool (*func)(const float& v) = [](const float& v) { return v < 0.0f; };
当我尝试使用 auto 关键字时,问题和以前一样:
auto func = [](const float& v) { return v < 0.0f; };
【问题讨论】:
-
你应该检查
val,而不是v。 -
您已经有了解释问题所在的答案,但也可能有用的是一种解决方法:
rng = FindFirstIf(rng, +[](const float& v) { return (v < 0.0f); });。+强制将 lambda 直接转换为函数指针(因为 lambda 类不提供重载的+运算符,但确实提供了一个转换为指针的运算符,其结果可以是+已应用),而 GCC 4.8 不会将其检测为不匹配的类型。 -
@hwd 谢谢这是非常好的解决方法
-
@manlio 我不确定您为什么觉得有必要在此处编辑标签,但如果您要这样做,请确保使用正确的标签。 OP 没有使用 GCC 4.9。我们可以从代码不适用于 OP 的事实中知道这一点。
-
@hvd 从接受的答案看来,它似乎是 v4.9 中解决的 gcc 错误