Re: Help needed to overload function template.
Hi Paul, I followed your example and defined the functions like showed
below:
Obs.: the code below is in the cpplib namespace.
template<
typename T,
typename Alloc,
template<typename, typename> class Container,
typename Predicate
>
Container<T, Alloc>& erase_if(Container<T, Alloc>& c, Predicate p)
{
c.erase (std::remove_if (c.begin (), c.end (), p), c.end ());
return c;
}
template<
typename Key,
typename T,
typename Compare,
typename Alloc,
template<typename, typename, typename, typename> class
MapClass,
typename Predicate
>
void erase_if(MapClass<Key, T, Compare, Alloc>& map, Predicate p)
{
typedef typename MapClass<Key, T, Compare, Alloc>::iterator
iterator;
iterator it = map.begin ();
const iterator end = map.end ();
while (it != end);
{
iterator tmp=it++;
if (p (*tmp))map.erase (tmp);
}
}
And called it this way:
....
typedef std::pair<int, std::string> MapEntry;
struct IsDigit : public std::unary_function<MapEntry, bool>
{
bool operator() (MapEntry p) {return isdigit (p.first);}
};
typedef std::map<int, std::string> Map;
BOOST_AUTO_TEST_SUITE(algorithm_util_suite)
BOOST_AUTO_TEST_CASE(erase_if_map)
{
Map map;
map[0] = "a";
map[1] = "1";
map[2] = "c";
cpplib::erase_if (map, IsDigit());
....
And the compiler complained saying it is ambiguous with this message:
||=== cpplib, Debug ===|
C:\projects\cpplib\test\algorithm_util_test.cpp||In member function
`void algorithm_util_suite::erase_if_map::test_method()':|
C:\projects\cpplib\test\algorithm_util_test.cpp|30|error: call of
overloaded `erase_if(Map&, IsDigit)' is ambiguous|
c:\projects\cpplib\algorithm_util.h|16|note: candidates are:
Container<T, Alloc>& cpplib::erase_if(Container<T, Alloc>&, Predicate)
[with T = int, Alloc = std::string, Container = std::map, Predicate =
IsDigit]|
c:\projects\cpplib\algorithm_util.h|31|note: void
cpplib::erase_if(MapClass<Key, T, Compare, Alloc>&, Predicate) [with
Key = int, T = std::string, Compare = std::less<int>, Alloc =
std::allocator<std::pair<const int, std::string> >, MapClass =
std::map, Predicate = IsDigit]|
||=== Build finished: 1 errors, 0 warnings ===|
If I try to fully qualify the call this way:
cpplib::erase_if<Map::key_type, Map::value_type, Map::key_compare,
Map::allocator_type, Map, IsDigit> (map, IsDigit());
It still does not find it:
C:\projects\cpplib\test\algorithm_util_test.cpp|30|error: no matching
function for call to `erase_if(Map&, IsDigit)'|
Any suggestions ?
Thank you very much for your help.
Best regards,
Mau.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]