2014-10-22 74 views
2

所以,我有以下簡單的例子:爲什麼std :: remove_if認爲shared_ptr <T>是一個謂詞?

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

using namespace std; 

struct foo 
{}; 


int main(void) 
{ 
    vector<shared_ptr<foo>> v; 

    auto f1 = make_shared<foo>(); 
    auto f2 = make_shared<foo>(); 
    auto f3 = make_shared<foo>(); 
    auto f4 = make_shared<foo>(); 

    v.push_back(f1); 
    v.push_back(f2); 
    v.push_back(f3); 
    v.push_back(f4); 

    cout << v.size() << endl; 

    v.erase(remove_if(begin(v), end(v), f2), end(v)); 

    cout << v.size() << endl; 
} 

爲什麼這個remove_if認爲f2是謂語,而不是我在找一個價值?我真的必須在這裏提供一個謂詞來使這個工作 - 或者我在這裏做錯了什麼?

(注:編譯器:GCC 4.8.2 -std = C++ 11)

編輯:應該有RTFM!無論如何 - 這裏是編譯器輸出:

In file included from /usr/local/gcc/4.8.2/include/c++/4.8/algorithm:62:0, 
       from remove_if.cpp:4: 
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h: In instantiation of '_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]': 
remove_if.cpp:29:41: required from here 
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:1150:33: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
     if(!bool(__pred(*__first))) 
           ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h: In instantiation of '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]': 
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:4465:41: required from '_IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]' 
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:1144:64: required from '_FIter std::remove_if(_FIter, _FIter, _Predicate) [with _FIter = __gnu_cxx::__normal_iterator<std::shared_ptr<foo>*, std::vector<std::shared_ptr<foo> > >; _Predicate = std::shared_ptr<foo>]' 
remove_if.cpp:29:41: required from here 
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:214:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:218:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:222:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:226:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:234:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:238:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
        ^
/usr/local/gcc/4.8.2/include/c++/4.8/bits/stl_algo.h:242:23: error: no match for call to '(std::shared_ptr<foo>) (std::shared_ptr<foo>&)' 
    if (__pred(*__first)) 
+1

這種混淆會更清晰一些編譯器輸出和您期望的輸出。 – 2014-10-22 10:41:33

+1

此代碼不能編譯。我不明白 – P0W 2014-10-22 10:42:54

+0

我會刪除,但是Mike已經正確回答了,所以我不會刪除,但是如果它確實關閉了 - 那就這樣吧.. – Nim 2014-10-22 10:45:18

回答

7

因爲這就是remove_if所做的;第三個參數是測試是否刪除元素的謂詞。據推測,你的代碼無法編譯,因爲shared_ptr不能被稱爲函數。

如果要刪除具有特定值的元素,請使用remove

+1

「std :: shared_ptr 」是一個謂詞嗎?如果沒有'operator()',我會認爲這會失敗。 – 2014-10-22 10:38:19

+1

arrgggh !!!剛注意到血腥的文檔(它在cppreference的相同頁面上)doh! – Nim 2014-10-22 10:38:50

+5

@LightnessRacesinOrbit:不是。但'remove_if'會試圖把它看作一個,可能無法編譯。 – 2014-10-22 10:38:57

相關問題