无法分配List Iterator [C ++]

时间:2013-05-23 12:30:54

标签: c++ visual-c++ stl

我有以下方法:

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。

4 个答案:

答案 0 :(得分:2)

据推测,array是一个数据成员,并且您处于const成员函数中,因此您无法在数据成员上调用非const方法。所以你需要一个const_iterator

list<void*>::const_iterator it,

答案 1 :(得分:1)

据推测,arrayvpArr_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 itarray可能是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 ++标准库的其余部分更加一致。

相关问题