简体   繁体   中英

Can't assign List Iterator [C++]

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.

Presumably array is a data member, and you are in a const member function, so you cannot call non-const methods on data members. So you need a const_iterator :

list<void*>::const_iterator it,

Presumably, array is a member of vpArr_t . Since this vpArr_t::operator[] overload is declared const , the members of vpArr_t are effectively also const . This ensures that you do not modify the vpArr_t object's state. Since array is effectively const , when you call begin on it, you get a const_iterator .

Since you aren't actually modifying the contents of array , you should change your iterator type to const_iterator :

list<void*>::const_iterator it;

If you do actually want to use a non- const iterator because you want to modify the contents of array , you'll need to make operator[] a non- const function.

Try list<void*>::const_iterator it instead: array is probably a const reference or a member variable in the class not marked as mutable . Your function is marked as const so member data cannot be modified within it.

Apart from the fact that you can't use iterator but have to use const_iterator , there is a function that can help you:

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

That said, calling a doubly-linked list an array is questionable. Also, this isn't really efficient, using a vector<> or deque<> would give you constant-time access to the i-th element. Also, I would use size_t for the index, which is more consistent with the rest of the C++ standardlibrary.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM