В дополнение к ответу Potatoswatter, если вы не возражаете против необходимости ссылаться на весь шаблонный тип карты несколько раз, вам нужно только создать подкласс итератора и не требовать каких-либо предварительных объявлений:
template<class key>
struct rec_map_iterator : map<key, vector<rec_map_iterator<key> > >::iterator
{
rec_map_iterator(typename map<key, vector<rec_map_iterator<key> > >::iterator i)
: map<key, vector<rec_map_iterator<key> > >::iterator(i)
{}
};
Тогда используйте полный тип:
map<int, vector<rec_map_iterator<int>>> m;
Кроме того, вот обновление (мое любимое на данный момент) для C ++ 11, объявив rec_map в качестве псевдонима, который можно задавать в качестве шаблона:
template<class key>
struct rec_map_iterator;
template<class key>
using rec_map = map<key, vector<rec_map_iterator<key>>>;
template<class key>
struct rec_map_iterator : rec_map<key>::iterator
{
rec_map_iterator(typename rec_map<key>::iterator i)
: rec_map<key>::iterator(i)
{}
};
Это работает так же, как версия Potatoswatter:
rec_map<int> my_map;