Существует два способа разыменования указателя, один из них - *
, а другой - ->
, где за последним должен следовать элемент данных или функция-член, связанная со статическим типом объекта-указателя.Пример:
void doStuff(const Rectangle&);
Rectangle rect{/* ... */};
Rectangle *pointer = ▭
doStuff(*pointer); // dereference the pointer
const double width = pointer->width(); // dereference and use a width() member function
То же самое относится к итераторам, где эти операторы перегружены.В вашем случае
it->getInfo();
//^^ dereference the iterator
выполняет разыменование на operator ->
, в то время как *it->getInfo()
пытается разыменовать возвращаемый тип getInfo()
, то есть void
.Между прочим, getInfo()
для функции-члена, возвращающей void
, является запутанным именем, вы могли бы подумать об этом.И позвольте мне добавить второе предложение здесь: цикл может быть упрощен диапазоном на основе цикла следующим образом:
for (const Rectangle& rect : v) {
rect.getInfo();
}
Обратите внимание, что переменная цикла rect
является const
-сположенной ссылкой, а небольше итератор - следовательно, не нужно ничего разыменовывать.