2013-03-11 81 views
2

我有這個功能使用比較功能

std::vector <std::vector <int> > puddles; 
std::set <int> is_checked; 

size_t M, N; 

bool v_compare(int a, int b){ 
    return puddles[(a-a%M)/M][a%M] < puddles[(b-b%M)/M][b%M]; 
} 

,我想找到其對應於puddles最小值設定的元素(我用i*M+j作爲集的關鍵)。所以,我想用我的功能作謂語的min_element

close(*std::min_element(is_checked.begin(), is_checked.end(), v_compare)); 

,但我得到這個錯誤

:113:82: error: no matching function for call to 'min_element(std::set<int>::iterator, std::set<int>::iterator, <unresolved overloaded function type>)' 
:113:82: note: candidates are: 
/usr/include/c++/4.6/bits/stl_algo.h:6173:5: note: template<class _FIter> _FIter std::min_element(_FIter, _FIter) 
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note: _FIter std::min_element(_FIter, _FIter, _Compare) [with _FIter = std::_Rb_tree_const_iterator<int>, _Compare = bool (TFlood::*)(int, int)] 
/usr/include/c++/4.6/bits/stl_algo.h:6201:5: note: no known conversion for argument 3 from '<unresolved overloaded function type>' to 'bool (TFlood::*)(int, int)' 
+0

是否有v_compare類的成員?它是否在標記爲'static'的類中聲明瞭它? – aschepler 2013-03-11 15:29:00

+0

是的,它是班級成員。我試圖使它靜態,但我有這個錯誤:18:12:錯誤:無效使用成員'TFlood :: M'在靜態成員函數 :21:63:錯誤:從這個位置 – arkhy 2013-03-11 15:35:38

回答

1

有一個函數指針和指向成員函數之間的差異。一個不是static的類成員會爲你提供一個指向成員函數的指針。但std::min_element只接受指向函數或其他可調用類型的指針,並且指向成員函數的指針不具有限定條件,因爲如果沒有指針或對類對象的引用就無法調用指針。正如您發現的,如果您嘗試將該功能設爲static成員,則無法獲得成員M。 (也許puddles,如果這也是一個成員。)

它看起來像你使用g ++ 4.6,它支持lambdas。因此最簡單的解決方法是:

close(*std::min_element(is_checked.begin(), is_checked.end(), 
     [this](int a, int b) { return puddles[a/M][a%M] < puddles[b/M][b%M]; })); 

(我擺脫了減法,因爲整數類型的劃分總是舍入到零,所以(a-(a%M))/M總是相同的結果a/M。)請確保您使用-std=c++0x編譯器標誌。 lambda魔術負責「捕獲」this指針,供比較對象稍後使用。

+0

這是很好的解決方案,但我需要獨立於編譯器的代碼 – arkhy 2013-03-11 16:08:16

+0

這是標準代碼,最近的編譯器會以同樣的方式處理它。只是它直到2011年底才正式標準化,所以一些較老的編譯器不會。如果您出於某種原因需要使用舊編譯器,則可以標記一個問題[C++ 03]。 – aschepler 2013-03-11 16:12:17

+0

ok,但仍然存在相同的問題:129:82:警告:lambda表達式僅適用於-std = C++ 0x或-std = gnu ++ 0x [默認情況下啓用] :129:83:error:沒有匹配函數調用'min_element(std :: set :: iterator,std :: set :: iterator,TFlood :: resolve():: )' ./tbricks_3。 cpp:129:83:note:candidate are: /usr/include/c++/4.6/bits/stl_algo.h:6173:5:note:template _FIter std :: min_element(_FIter,_FIter) /usr/include/C++/4.6/bits/stl_algo.h:6201:5:note:template _FIter std :: min_element(_FIter,_FIter,_Compare) – arkhy 2013-03-11 16:21:53