[英]Iterating a Vector in C++
因此,根据我发现的其他示例,我被认为是对m_vect进行迭代的正确代码:
for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)
但是,在尝试编译时,在该行上出现以下错误:
heap.h:167:6: error: need ‘typename’ before ‘std::vector<T>::iterator’ because ‘std::vector<T>’ is a dependent scope
就像我说的那样,我从另一段代码复制并改写了该行,所以我真的不确定自己在做对与错。 有见识吗?
为了澄清,这是在模板函数中,我已经声明了'template'。 m_vect是向量类型。 我不知道如何显示小于和大于正确的显示...
幸运的是,在C ++ 11中,您可以让编译器解决该问题。 编译器已经知道m_vect是什么,因此您可以告诉它:
for (auto it= m_vect.begin(); ( it != m_vect.end()) ; ++ it ) { }
但是,等等,还有更多。 在c ++ 11中,您甚至可以遍历m_vect
所有m_vect
for (auto it : m_vect ) { }
您能告诉我,我认为在C ++ 03中进行迭代是疯狂的,并且在现实生活中我从未见过有人这样做,而在C ++ 11中,迭代效果要好上千倍?
这似乎是在模板函数中,而vector<T>::iterator
是一种依赖于T
的类型, T
是模板参数。 由于可以使用任何不同类型的唯一定义来专门化模板,因此,在模板实际实例化之前,编译器无法确定vector<T>::iterator
是类型还是静态成员。 如果它是静态成员,那么从语法上讲这没有任何意义:
for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)
您需要做的就是告诉编译vector<T>::iterator
是一种类型。 为此使用typename
:
for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)
如果您读取了错误,则可以看到这正是编译器告诉您的。
T
必须是实际类型。 它应该是向量中存储的任何类型。 您的for
循环看起来正确。 您m_vect
某处声明了m_vect
。 迭代器需要与您声明的m_vect
相同的时间(当然m_vect
加上::iterator
)。
这是编译器现在正在执行的更好的东西。
当使用从模板派生的东西时,必须通过添加typename
来标记它是否被用作类型。 然后,如果编译器知道(出于某种疯狂的原因) vector<T>::iterator
是一种方法,则它可以立即标记错误而不是进入未定义的行为。
因此,只需添加typename
如消息所示:
for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)
如果您有足够现代的编译器,则可以将auto
vector<T>::iterator
替换为auto
。
否则,找到正确的类型以将T
替换为您的向量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.