使用lambda表达式和std :: function没有匹配的函数调用错误。

时间:2018-12-28 23:16:33

标签: c++ c++11 lambda

我正在尝试在我的代码中使用此lambda表达式。似乎函子或lambda的定义有问题。

我相信lambda表达式是正确的。但是我不能满足我定义的函数原型。

函数定义:

    template<typename E, typename container> 
void for_each(Iterator<E,container> begin, std::function<void(E&)> fun)
{
    do // does the given unary functor to elements 
    {  //from starting iterator 'til the end.
        fun(*begin);
        begin = begin.next();
    }while(begin.hasNext());

    fun(*begin);
}

呼叫者:

  for_each(c.iterator(), [&](E& e){add(e);});

除了用lambda表达式实现此函数调用外,我都可以。但是编译器会说“错误:没有匹配的函数可以调用..”

2 个答案:

答案 0 :(得分:1)

lambda不是std::function,因此推论失败。

您可以简单地通过通用Functor

template<typename E, typename container, typename F> 
void for_each(Iterator<E, container> begin, F&& fun)
{
    // ...
}

答案 1 :(得分:0)

下面的代码和可能的解决方法问题:

1。 Lambda expression不是std::function,它只能存储在std::function类型的对象中。

方法:(使用您现有的签名):

std::function<void()> f = []() -> void { // do something };
for_each(vec.begin(), vec.end(), f);

2。更好的解决方案是使用Callable作为参数(转到答案的结尾)。

3。如果要提取自己的for_each版本,为什么不遵循与其他算法一致的实现,或者不遵循算法标头中for_each的实现。 < / p>

满足您的所有需求,并且与其他标准算法一致:en.cppreference.com/algorithms/for_each

    template<class InputIt, class UnaryFunction>
    constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
    {
      for (; first != last; ++first) {
        f(*first);
      }
      return f;
    }