2017-07-07 78 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