这是我的问题:
我有一个std::vector<AguiWidgetBase*>
,用于跟踪子控件。
我有这两个函数来返回迭代器:
std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildBeginIterator() const
{
return children.begin();
}
std::vector<AguiWidgetBase*>::const_iterator AguiWidgetBase::getChildEndIterator() const
{
return children.end();
}
然后我就这样使用它:
for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator();
it != box->getChildEndIterator(); ++it)
{
it->setText("Hello World");
}
我收到了这些错误:
Error 3 error C2039: 'setText' : is not a member of 'std::_Vector_const_iterator<_Ty,_Alloc>' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112
Error 2 error C2839: invalid return type 'AguiWidgetBase *const *' for overloaded 'operator ->' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\main.cpp 112
为什么它会给我这些错误?
由于
答案 0 :(得分:23)
因为迭代器就像一个指针,在这种情况下是一个指针指针。
你需要:
(*it)->setText("Hello World"); // dereference iterator, dereference pointer
答案 1 :(得分:4)
有没有办法可以改变我的迭代器,以便它 - &gt;作品?
不是直接的,但你可以这样做:
for(std::vector<AguiWidgetBase*>::const_iterator it = box->getChildBeginIterator();
it != box->getChildEndIterator(); ++it)
{
AguiWidgetBase* p = *it;
p->setText("Hello World");
}
答案 2 :(得分:0)
正如其他人所指出的那样,这是因为存储在向量中的对象是指针,所以你对实际对象有一个额外的间接层。
您可以使用boost::ptr_vector
通过指针收集AguiWidgets,但使用它们就好像它们按值存储一样?我没有广泛使用它,但我模糊的回忆是它的工作原理。