我有以下代码:
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由我实现)
答案 0 :(得分:2)
声明
typename List<Pair>::Iterator Iterator;
将Iterator
声明为变量。
它不再是一种类型。
<小时/>
您的意思是写typedef
,而不是typename
?
这将解决眼前的问题,但不会解决此类问题。
为了避免此类问题,请将C ++ 11 auto
用作迭代器作为循环控制变量。
<小时/>
不要明确使用new
和delete
来实现动态大小的数组,而应考虑使用std::vector
。更方便,更安全等等。工作少,更愉快!
答案 1 :(得分:1)
“Iterator”它应该是一个c ++ iterator
?因为如果是,那就是问题所在。对j使用关键字auto,它应该这样做。
它给你错误的原因是因为迭代器未完全/正确声明/初始化。
请记住,迭代器是模板类,因此您应该立即知道它至少需要一个模板参数,即forward_list<int>::iterator
。
答案 2 :(得分:0)
如果Iterator
未完全定义,则可能会出现此错误。通常,您会在此之前看到有关未定义类型的错误。
或者如果您使用的是古老的MS编译器。