2017-07-07 113 views
1

我有一个定义lambda函数的结构。下面是该结构调用结构中的lambda函数

AccumulateUtils.cpp文件

#include <functional> 

template <typename T> 
struct AccumulateUtils { 
     std::function<T()> add_first = [] (T value, const T& pair) { 
      return value + pair.first; 
     }; 
}; 

main()这种结构用于std::accumulate来算图的第一指标的总和的代码。下面是代码:

的main.cpp文件

#include <iostream> 
#include <map> 
#include <numeric> 
#include "AccumulateUtils.cpp" 

int main() { 
    std::map<double, int> data = /*some map*/; 
    AccumulateUtils<double> utils; 

    std::cout << std::accumulate(data.begin(), data.end(), 0.0, utils.add_first); 

    return 0; 
} 

Сompiler提供了以下错误:

错误C2228左 '首先' 必须有类/结构/联合
错误C2664'std :: function :: function(std :: function & &)':无法将参数1从 'AccumulateUtils ::' to'std :: nullptr_t

为什么这些错误?代码中出现了什么问题?

+4

*为什么*它必须是lambda?为什么你不能在命名空间中使用正常的模板函数? –

+0

为什么不重载'operator()' –

+0

至于你当前的代码,你没有看到任何问题,你声明'std :: function'带* no *参数,并让lambda带两个参数?或者让模板类型“T”表示*两个*事物(包括'double' *和* a'std :: pair ')? –

回答

0

您的lambda函数的签名为???(T, T const &),它不可转换为T(),即std::function的签名。 此外,lambda本身已损坏,因为T不能既是一个值又是一对值。就像

std::function<T(T, std::pair<T, T> const &)> fun = 
[](T value, std::pair<T, T> const & pair) 
{ 
    return value + pair.first; 
}; 

的作品,但我不知道这是你想要完成的。

+1

pair应该是'std :: pair ',即不是相同的类型 –

+0

'std :: function const&)>'to避免复制/转换对。 – Jarod42