2013-05-23 8 views
0

У меня есть следующий метод:Невозможно назначить Список итератора [C++]

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

Вы можете попробовать авто вместо списка :: iterator? – ZoomIn

ответ

2

Предположительно, array является членом данных, и вы находитесь в функции-члене const, поэтому вы не можете вызывать не-const методы для элементов данных. Так что вам нужно const_iterator:

list<void*>::const_iterator it, 
+0

Я пробовал, но когда я это делаю, я не могу увеличить итератор .. – Billie

+1

@ user1798362 Вы должны иметь возможность увеличить его.Вы уверены, что не выполнили 'const list :: const_iterator' или что-то еще? –

+0

Теперь я это делаю, но по этой причине он не увеличивает итератор, и он держится на 0x0000000, хотя петли выполняются 2 раза – Billie

0

Попробуйте list<void*>::const_iterator it вместо: array вероятно константной ссылки или переменную-член в классе не помеченный как mutable. Ваша функция отмечена как const, поэтому данные элемента не могут быть изменены внутри нее.

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[] a не const.

0

Помимо того, что вы не можете использовать iterator но должны использовать const_iterator, есть функция, которая может помочь вам:

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

Тем не менее, вызов дважды связанный список массив вызывает сомнения , Кроме того, это не очень эффективно, использование vector<> или deque<> даст вам постоянный доступ к i-му элементу. Кроме того, я бы использовал size_t для индекса, который более соответствует остальной части стандартной библиотеки C++.

Смежные вопросы