У меня есть следующий код:
typename List<Pair>::Iterator Iterator;
int changeTableSize(int newSize, int originalSize){
List<Pair>* temp = new List<Pair>[newSize];
for (int i = 0; i < originalSize; i++){
for (Iterator j = elements[i].begin(); j != elements[i].end(); j++){
Pair p = *j;
temp[p.key % newSize].insert(p);
}
}
delete elements;
elements = temp;
return newSize;
}
Компилятор говорит, что j не был объявлен в этой области. Что может вызвать это?
(Обратите внимание, что List и Pair реализованы мной)
Заявление
typename List<Pair>::Iterator Iterator;
объявляет Iterator
как переменную.
Это уже не тип.
Вы имели в виду написать typedef
, а не typename
?
Это установит непосредственную проблему, но не будущие проблемы такого рода.
Чтобы избежать таких проблем, используйте С++ 11 auto
для итераторов в качестве переменных управления контуром.
Вместо явного использования new
и delete
для реализации массива с динамическим размером рассмотрим только использование std::vector
. Гораздо удобнее, безопаснее и т.д. И т.д. Меньше работы, приятнее!
"Итератор" - это iterator
c++? Потому что, если это так, то тогда, где проблема. Используйте ключевое слово auto для j, и оно должно это сделать.
Причина, по которой он дает вам ошибку, состоит в том, что итератор не полностью/правильно объявлен/инициализирован.
помните, что итераторы - это классы шаблонов, поэтому вы должны немедленно знать, что для этого требуется хотя бы один параметр шаблона, т.е. forward_list<int>::iterator
.
Если Iterator
не полностью определен, вы можете получить эту ошибку. Обычно вы увидите ошибки в том, что тип еще не определен до этого.
Или, может быть, если вы используете древний компилятор MS.
elements
? Вашему вопросу не хватает контекста.