所以,我有以下简单的例子:为什么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))
这种混淆会更清晰一些编译器输出和您期望的输出。 – 2014-10-22 10:41:33
此代码不能编译。我不明白 – P0W 2014-10-22 10:42:54
我会删除,但是Mike已经正确回答了,所以我不会删除,但是如果它确实关闭了 - 那就这样吧.. – Nim 2014-10-22 10:45:18