2012-05-23 70 views
3

我有一個容器對象lambda表達式和find_if:使用對集合

R Container; 

R是list<T*>類型或vector<T*>

我試圖寫入以下功能:

template<typename T, typename R> 
T& tContainer_t<T, R>::Find(T const item) const 
{ 
typename R::const_iterator it = std::find_if(Container.begin(), Container.end(), [item](const R&v) { return item == v; }); 
if (it != Container.end()) 
    return (**it); 
else 
    throw Exception("Item not found in container"); 
} 

嘗試方法時(v是我班的對象)

double f = 1.1; 
v.Find(f); 

我得到binary '==' : no operator found which takes a left-hand operand of type 'const double' (or there is no acceptable conversion)

我感到困惑與lambda表達式的語法和我應該寫那裏,找不到任何解釋友好。

出了什麼問題? 10X。

+0

你會考慮將Find簽名寫爲接受'(const T item)'而不是'(T const item)'嗎?或者甚至更好,使用'const T&item'。 – Jaywalker

+0

您正在將'const R&gt;作爲參數傳遞給lambda,而不是'const T *'。 – sbabbi

回答

6

缺少一些背景,但我注意到:

  • 將返回**it,所以你可能要比較​​
  • 您通過const R&v,我懷疑
  • 你用你的意思const T&v到拉姆達一個const_iterator,但返回了一個非const引用。這是一個不匹配
  • 我做了一些PARAMS常量&效率(並支持不可複製/不可移動型)

這裏是工作的代碼,剝離缺少類的引用:

#include <vector> 
#include <algorithm> 
#include <iostream> 

template<typename T, typename R=std::vector<T> > 
T& Find(R& Container, T const& item) 
{ 
    typename R::iterator it = std::find_if(Container.begin(), Container.end(), [&item](const T&v) { return item == v; }); 
    if (it != Container.end()) 
     return *it; 
    else 
     throw "TODO implement"; 
} 

int main(int argc, const char *argv[]) 
{ 
    std::vector<double> v { 0, 1, 2, 3 }; 
    Find(v, 2.0); // not '2', but '2.0' ! 
    return 0; 
} 
+0

試驗一個錯誤導致我'typename R :: const_iterator它= std :: find_if(Container.begin(),Container.end(),[item](const T * v){return * v == item;} );' – Michael

+0

虛假downvoter請解釋他/她:/ – sehe