我有以下功能:
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; };
答案 0 :(得分:2)
我怀疑你的代码中有一个type-o,或者你使用的是一个没有完全实现lambdas(或者两者都有)的gcc版本。
如果你的例子是:
[](const float& val) { return (val < 0.0f); }
(v - &gt; val)
和如果Range::ConstReference
是const float&
,则代码是合法的C ++ 11。
这里棘手的部分是一些 lambdas将隐式转换为函数指针。也就是说,没有 lambda-capture 的lambda将转换为具有相同签名的函数指针。
此:
template <class Range>
Range
FindFirstIf(Range, bool (*Function)(typename Range::ConstReference value));
struct range
{
using ConstReference = const float&;
};
int
main()
{
range rng;
rng = FindFirstIf(rng, [](const float& val) { return (val < 0.0f); });
}
为我编译。
通过在线gcc编译器进行一些调整,这似乎是gcc 4.8中的一个错误,修复为4.9。