У меня есть заявление typedef:
typedef list <Event *> EventList;
который находится сам по себе в моем заголовочном файле (не является частью класса).
У меня есть функция nd_to_el(), в которой я хочу перебрать эту EventList, которая уже заполнена экземплярами Event.
Это то, что я пробовал:
EventList::iterator it;
for (it = this->el.begin(); it != this->el.end(); ++it){
cout << (*it)->key << endl;
}
(Я также не уверен, правильно ли здесь разыменовывать итератор или нет)
но я получаю эту ошибку:
error: request for member ‘end’ in ‘((CS302_Midi*)this)->CS302_Midi::el’, which is of pointer type ‘EventList*’ {aka ‘std::__cxx11::list<Event*>*’} (maybe you meant to use ‘->’ ?)
for (it = this->el.begin(); it != this->el.end(); ++it)
Я не думаю, что я собираюсь здесь использовать оператор стрелки.
Есть ли причина, по которой ваш list содержит указатели вместо необработанных Event объектов? Для этого могут быть причины, но в большинстве случаев указатели не нужны (особенно, когда вы используете list, а узлы list можно переставлять с семантикой нулевого копирования и перемещения, что дает преимущества указатели еще меньше) и усугубляют ситуацию по нескольким причинам.
@ShadowRanger Это был заданный заголовочный файл, но я уверен, что в использовании указателей нет особого смысла. Однако существуют и другие функции, написанные на основе этого формата.
«Я хочу пройтись по этому списку событий» — через что EventList? Вы дали определение типа и заявили, что «не является частью класса». Потом вы упомянули функцию, и вдруг появился объект такого типа, и каким-то образом мы теперь находимся в контексте класса (поскольку используется указатель this)? Я думаю, что вы пропустили слишком много шагов в своем объяснении.





Судя по сообщению об ошибке
{aka ‘std::__cxx11::list<Event*>*’} (возможно, вы имели в виду использовать ‘->’ ?)
кажется, у вас есть указатель на список.
В этом случае цикл может выглядеть так
for (it = this->el->begin(); it != this->el->end(); ++it){
cout << (*it)->key << endl;
}
Или вы можете использовать цикл for на основе диапазона, например
for ( const auto &e : *this->el )
{
cout << e->key << endl;
}
И тогда вам следует избавиться от this->, чтобы было немного чище: for (it = el->begin(); it != el->end(); ++it) или for ( const auto &e : *el ).
Итератор — это абстракция, предназначенная для работы во многом аналогично указателю, поэтому в некотором смысле
itявляется указателем на указатель, и его необходимо разыменовать, чтобы получить доступ к указателю, на который он ссылается.