Скажем, у меня есть два класса, определенных как таковые:
namespace DecaveNamespace {
class MyElt1 {
public:
list<MyElt2>::iterator elt2;
}
class MyElt2 {
public:
list<MyElt1>iterator elt1;
}
}
Другими словами, для всех намерений и целей каждый класс имеет указатель на элемент другого класса, который инкапсулируется как итератор.
Теперь скажите, что я выполняю некоторую логику в функции и хочу обновить указатель в MyElt1
указать на другой экземпляр класса MyElt2
, Другими словами:
// ... some logic
MyElt1 some_elt_1 = some_logic();
MyElt2 some_elt_2 = some_logic_2();
some_elt_1.elt2 = &some_elt_2;
Если я пытаюсь сделать выше, я получаю вышеупомянутую ошибку компилятора:
/usr/include/c++/4.8.2/bits/stl_list.h:125:12: note: no known conversion for argument 1 from ‘DecaveNamespace::MyElt2*’ to ‘std::_List_iterator<DecaveNamespace::MyElt2>&&’
Ясно, что проблема в том, что я передаю неправильный адрес в ссылку на итератор. А то как мне обновить MyElt1
указатель на новый объект?
Итератор списка по определению является итератором в список. Он может указывать только на объекты, принадлежащие списку. Ваш единственный выбор — поместить объект в список, чтобы вы могли получить к нему итератор.
Если объект уже находится в списке, найдите его в списке, чтобы получить к нему итератор. Обратите внимание, что хранение итераторов в классах опасно, поскольку многие операции со списком делают его итераторами недействительными.
Других решений пока нет …