如果我已经构建了一个我想要包含在其中的类,例如一个集合,我将如何遍历所述集合?我可以说
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();
}
}
答案 0 :(得分:4)
((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();
答案 1 :(得分:2)
我认为(至少)你的一个问题是这一行:
*it.draw_in_place();
编译器将其解释为
*(it.draw_in_place());
与您的预期
(*it).draw_in_place();
要解决此问题,请考虑使用箭头操作符,如
it->draw_in_place();
将自定义对象存储在STL集中是完全合法的,只要它们可以默认与<
运算符进行比较。如果他们不能,则您需要在其上定义operator <
,或者为set
提供自定义比较器,或为您的特定类型提供std::less
。