视觉对象无法分配列表迭代器 [C++]

visual Can't assign List Iterator [C++]

本文关键字:迭代器 C++ 列表 分配 对象 视觉      更新时间:2023-10-16

我有以下方法:

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类型。

但是我注意到begin()方法有一个iterator重载。如何解决这个错误?我用的是Visual c++ 2012

假设array是一个数据成员,而您在const成员函数中,因此您不能在数据成员上调用非const方法。所以你需要一个const_iterator:

list<void*>::const_iterator it,

可以推测,arrayvpArr_t的成员。因为这个vpArr_t::operator[]重载被声明为const,所以vpArr_t的成员实际上也是const。这确保了您不会修改vpArr_t对象的状态。由于array实际上是const,当你调用begin时,你会得到一个const_iterator

由于实际上没有修改array的内容,因此应该将迭代器类型更改为const_iterator:

list<void*>::const_iterator it;

如果你想要修改array的内容而使用一个非const的迭代器,你需要让operator[]成为一个非const的函数。

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

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

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

也就是说,将双链表称为数组是有问题的。而且,这并不是很有效,使用vector<>deque<>会让您在恒定时间内访问第i个元素。此外,我将使用size_t作为索引,这与c++标准库的其余部分更加一致。