我有以下方法:
void* vpArr_t::operator[](int i) const
{
if (!isEmpty() && i >= 0 && i < nOfItems)
{
list<void*>::iterator it;
int idx;
for(it = array.begin(), idx = 0; idx < i; ++it, ++idx); // go to the i'th element
return *it;
}
else
{
return NULL;
}
}
其中:
array
是一个列表类型。
我在下一行中遇到红色下划线(编译错误):
for(it = array.begin(), idx = 0; idx < i; ++it, ++idx);
在:
it = array.begin()
它说我要将list<void*>::const_iterator
设置为list<void*>::iterator
类型。
但我注意到iterator
方法存在begin()
重载。如何解决这个错误?我正在使用Visual C ++ 2012。
答案 0 :(得分:2)
据推测,array
是一个数据成员,并且您处于const
成员函数中,因此您无法在数据成员上调用非const方法。所以你需要一个const_iterator
:
list<void*>::const_iterator it,
答案 1 :(得分:1)
据推测,array
是vpArr_t
的成员。由于此vpArr_t::operator[]
重载已声明为const
,因此vpArr_t
的成员实际上也是const
。这可确保您不会修改vpArr_t
对象的状态。由于array
实际上是const
,当您在其上调用begin
时,会得到const_iterator
。
由于您实际上并未修改array
的内容,因此应将迭代器类型更改为const_iterator
:
list<void*>::const_iterator it;
如果您确实想要使用非const
迭代器,因为您想要修改array
的内容,则需要使operator[]
成为非const
功能。
答案 2 :(得分:0)
请尝试使用list<void*>::const_iterator it
:array
可能是const引用或类中未标记为mutable
的成员变量。您的函数标记为const,因此无法在其中修改成员数据。
答案 3 :(得分:0)
除了您无法使用iterator
但必须使用const_iterator
之外,还有一项功能可以帮助您:
list<void*>::const_iterator it = arary.begin();
std::advance(it, i);
也就是说,将一个双向链表调用一个数组是值得怀疑的。此外,这不是很有效,使用vector<>
或deque<>
可以让您实时访问第i个元素。另外,我会使用size_t
作为索引,这与C ++标准库的其余部分更加一致。