Причина, по которой это не работает, заключается в том, что std::map
принимает четыре аргументы шаблона:
template<class Key,
class Value,
class Predicate = std::less<Key>,
class Allocator = std::allocator<pair<const Key, Value> > >
class map;
Хотя вы можете опустить последние два параметра для создания экземпляров, вы должны перечислить их для соответствия шаблонов для работы:
template < typename TKey,
typename TVal,
class TPr,
class TAl
template<typename,typename,class,class> TContainer >
void func(const TContainer<TKey, TVal, TPr, TAl>& container)
{
for (typename TContainer<TKey, TVal, TPr, TAl>::iterator it = container.begin(); it != container.end(); ++it)
{
do_something(it->second);
}
}
Тем не менее, мне интересно, почему вы беспокоитесь об этом. Идиоматическим способом было бы передать итераторы:
template <typename FwdIt>
void func(FwdIt begin, FwdIt end)
{
while(begin != end) {
do_something(begin->second);
++begin;
}
}
Это также позволяет передавать все, что совместимо:
void f(const std::vector< std::pair<int, std::string> >& v)
{
func( v.begin(), v.end() );
}