Имейте обзор кода перед каждой фиксацией (даже если это - 1 минута, "я изменил это имя переменной"), и как часть обзора кода, рассмотрите любые модульные тесты.
не заканчивают на фиксации, пока тесты не существуют.
(Также - Если его работа не была протестирована - почему это было в производственной сборке во-первых? Если это не тестируется, не впускайте его, то Вы не должны будете работать выходные)
Вы можете использовать прямое объявление нового типа.
class MapItContainers;
typedef map<int, MapItContainers>::iterator MyMap_it;
class MapItContainers
{
public:
vector<MyMap_it> vec;
};
С этим косвенным обращением компилятор должен позволить вам избежать неприятностей. Это не очень красиво, но, честно говоря, я не думаю, что вы можете легко сломать самореференцию.
Не слишком уродливо, учитывая…
Это работает в GCC 4.0.1 и прекрасно компилируется в строгом режиме Comeau.
Определения шаблонов анализируются и откладываются до тех пор, пока они не будут созданы. Компилятор даже не видит, что такое rec_map_iterator, пока не придет время его создать, и к этому времени он уже знает, как это сделать; v).
template< class key >
struct rec_map;
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) {}
};
template< class key >
struct rec_map : map< key, vector< rec_map_iterator< key > > > {};
Вот тестовая программа, которую я использовал.
#include <iostream>
#include <map>
#include <vector>
using namespace std;
template< class key >
struct rec_map;
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) {}
};
template< class key >
struct rec_map : map< key, vector< rec_map_iterator< key > > > {};
int main( int argc, char ** argv ) {
rec_map< int > my_map;
my_map[4];
my_map[6].push_back( my_map.begin() );
cerr << my_map[6].front()->first << endl;
return 0;
}
В моем предыдущем ответе мне не понравилось извлечение из контейнера, поэтому вот альтернатива:
template< class key >
struct rec_map_gen {
struct i;
typedef map< key, vector< i > > t;
struct i : t::iterator {
i( typename t::iterator v )
: t::iterator(v) {}
};
};
Теперь вы должны использовать rec_map_gen
, rec_map_gen
и т.д., но у вас также есть доступ ко всем конструкторам std :: map
. Жаль, что C ++ не позволяет создавать шаблоны typedef.
Использование производного типа итератора должно быть приемлемым. Вы все еще можете инициализировать обратный итератор, например, из элемента этой структуры.