2017-03-11 35 views
2

究竟做了編譯器裝置,這個:解密UPPER_BOUND與reverse_iterator的STL錯誤

c:\usr\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h: 
In function 
'_FIter std::upper_bound(_FIter, _FIter, const _Tp&) 
[ 
    with _FIter = std::reverse_iterator< 
    __gnu_cxx::__normal_iterator<ModelItem*, std::vector<ModelItem> > >, 
    _Tp = Model::close_active(int)::<lambda(const t_item&)> 
]': 

model.cpp:58:3: instantiated from here 


c:\usr\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/stl_algo.h:2461:4: 

error: no match for 'operator<' in 
'__val < __middle.std::reverse_iterator<_Iterator>::operator* 

[ 
    with _Iterator = 
    __gnu_cxx::__normal_iterator<ModelItem*, std::vector<ModelItem> >, 
    std::reverse_iterator<_Iterator>::reference = ModelItem& 
]()' 

對於這個和平的代碼:

t_itemlist::reverse_iterator rit = std::upper_bound(
    m_itemlist.rbegin(), m_itemlist.rend(), 
    [&at](const t_item& item){ return item.at > at; } 
); 

我想用反向迭代器。

(SO形成問我用文字添加更多細節,問題是它過於意見更多的代碼,但我不知道該說什麼了。)

回答

2

upper_bound 3放慢參數版本不指望一個比較函數,但期望值作爲其第三個參數。

比較函數必須有兩個參數,因爲它取代了operator<這是一個二元運算符。

胡亂猜測:

auto rit = std::upper_bound(m_itemlist.rbegin(), m_itemlist.rend(), at, 
    [](auto const& at, auto const& item) { return at < item.at; }); 
+0

謝謝,看來我也錯過了'upper_bound'的'value' PARAM。 – user394010