Reputation: 2735
In the 1st code snippet below, I am trying to remove an element from a vector within a member function based on a static condition function fed into std::remove function. Then I am getting lots of template errors shown in the 2nd snippet. Can you please tell me what I am missing?
SNIPPET 1 (CODE)
void removeVipAddress(std::string &uuid)
{
struct RemoveCond
{
static bool condition(const VipAddressEntity & o)
{
return o.getUUID() == uuid;
}
};
std::vector<VipAddressEntity>::iterator last =
std::remove(
mVipAddressList.begin(),
mVipAddressList.end(),
RemoveCond::condition);
mVipAddressList.erase(last, mVipAddressList.end());
}
SNIPPET 2 (COMPILATION OUTPUT)
/usr/include/c++/4.7/bits/random.h:4845:5: note: template<class _IntType> bool std::operator==(const std::discrete_distribution<_IntType>&, const std::discrete_distribution<_IntType>&)
/usr/include/c++/4.7/bits/random.h:4845:5: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/4.7/algorithm:63:0,
from Entity.hpp:12:
/usr/include/c++/4.7/bits/stl_algo.h:174:4: note: ‘ECLBCP::VipAddressEntity’ is not derived from ‘const std::discrete_distribution<_IntType>’
In file included from /usr/include/c++/4.7/random:50:0,
from /usr/include/c++/4.7/bits/stl_algo.h:67,
from /usr/include/c++/4.7/algorithm:63,
from Entity.hpp:12:
/usr/include/c++/4.7/bits/random.h:4613:5: note: template<class _RealType> bool std::operator==(const std::extreme_value_distribution<_RealType>&, const std::extreme_value_distribution<_RealType>&)
/usr/include/c++/4.7/bits/random.h:4613:5: note: template argument deduction/substitution failed:
In file included from /usr/include/c++/4.7/algorithm:63:0,
from Entity.hpp:12:
/usr/include/c++/4.7/bits/stl_algo.h:174:4: note: ‘ECLBCP::VipAddressEntity’ is not derived from ‘const std::extreme_value_distribution<_RealType>’
Upvotes: 1
Views: 298
Reputation: 171127
I guess you're looking for std::remove_if()
, not std::remove()
.
std::remove_if()
accepts a predicate as it third argument, and removes elements satisfying that predicate.
std::remove()
takes a value as the third argument, and removes elements equal to the value.
EDIT
To make this work, you will also have to turn your RemoveCond
definition into a predicate object, because it needs state. Like this:
void removeVipAddress(std::string &uuid)
{
struct RemoveCond : public std::unary_function<VipAddressEntity, bool>
{
std::string uuid;
RemoveCond(const std::string &uuid) : uuid(uuid) {}
bool operator() (const VipAddressEntity & o)
{
return o.getUUID() == uuid;
}
};
std::vector<VipAddressEntity>::iterator last =
std::remove(
mVipAddressList.begin(),
mVipAddressList.end(),
RemoveCond(uuid));
mVipAddressList.erase(last, mVipAddressList.end());
}
Upvotes: 4