Итератор для контейнера пользовательского объекта - PullRequest
2 голосов
/ 26 января 2011

Если бы я создал класс, который я хочу содержать внутри, например, набор, как бы я перебрал этот набор? Могу я сказать

 std::set<customObject>::iterator it

Я думал, что смогу это сделать, но получаю следующую серию ошибок ...

drawing.h:110: error: no match for ‘operator=’ in ‘it = ((object*)this)->object::objects. std::vector<_Tp, _Alloc>::begin [with _Tp = object, _Alloc = std::allocator<object>]()’
/usr/include/c++/4.2.1/bits/stl_tree.h:225: note: candidates are: std::_Rb_tree_const_iterator<object>& std::_Rb_tree_const_iterator<object>::operator=(const std::_Rb_tree_const_iterator<object>&)
drawing.h:110: error: no match for ‘operator!=’ in ‘it != ((object*)this)->object::objects. std::vector<_Tp, _Alloc>::end [with _Tp = object, _Alloc = std::allocator<object>]()’
/usr/include/c++/4.2.1/bits/stl_tree.h:292: note: candidates are: bool std::_Rb_tree_const_iterator<_Tp>::operator!=(const std::_Rb_tree_const_iterator<_Tp>&) const [with _Tp = object]
drawing.h:111: error: ‘struct std::_Rb_tree_const_iterator<object>’ has no member named ‘sketch’

вот мой код:

void draw_in_place()
        {
            place();
            std::set<object>::const_iterator it;
            for(it = objects.begin(); it != objects.end(); it++){
                *it.draw_in_place();
            }
        }

Ответы [ 2 ]

4 голосов
/ 26 января 2011
((object*)this)->object::objects. std::vector<_Tp, _Alloc>::begin

objects, по-видимому, std::vector<object>, а не std::set<object>. Поэтому вам нужно использовать std::vector<object>::const_iterator.

*it.draw_in_place();

Это неверно: вам нужно разыменовать итератор, чтобы сначала получить доступ к элементу, а затем использовать элемент:

(*it).draw_in_place();
// or
it->draw_in_place();
2 голосов
/ 26 января 2011

Я думаю (по крайней мере) одной из ваших проблем является эта строка:

*it.draw_in_place();

Компилятор интерпретирует это как

*(it.draw_in_place());

против вашего предполагаемого

(*it).draw_in_place();

Чтобы исправить это, рассмотрите возможность использования оператора со стрелкой, как в

it->draw_in_place();

Совершенно законно хранить пользовательские объекты в наборе STL, если их можно сравнить с оператором < по умолчанию. Если они не могут, вам нужно либо определить для них operator <, либо предоставить собственный компаратор для set, либо специализировать std::less для вашего конкретного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...