0

I have the following method:

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;
    }
}

Where:

array is a list type.

I'm getting a red underline (compilation error) in the following line:

for(it = array.begin(), idx = 0; idx < i; ++it, ++idx);

at:

it = array.begin()

it says that I'm tring to set a list<void*>::const_iterator into a list<void*>::iterator type.

But I noticed that there's a iterator overloading for the begin() method. how to solve this error? I'm using Visual C++ 2012.

4

4 回答 4

2

大概array是一个数据成员,并且你在一个const成员函数中,所以你不能在数据成员上调用非常量方法。所以你需要一个const_iterator

list<void*>::const_iterator it,
于 2013-05-23T12:33:12.330 回答
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函数。

于 2013-05-23T12:33:53.867 回答
0

list<void*>::const_iterator it改为尝试:array可能是未标记为的类中的 const 引用或成员变量mutable。您的函数被标记为 const,因此无法在其中修改成员数据。

于 2013-05-23T12:33:26.600 回答
0

除了不能使用iterator但必须使用的事实之外const_iterator,还有一个功能可以帮助您:

list<void*>::const_iterator it = arary.begin();
std::advance(it, i);

也就是说,将双向链表称为数组是有问题的。此外,这并不是真正有效的,使用 a vector<>ordeque<>会给你对第 i 个元素的恒定时间访问。此外,我会使用size_t索引,它与 C++ 标准库的其余部分更加一致。

于 2013-05-23T12:47:22.560 回答