因此,基于我发现的其他示例,我们相信这将是迭代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
就像我说的那样,我从另一段代码中复制并修改了这一行,所以我真的不确定我做对与错。有什么见解吗?
为了澄清,这是一个模板功能,我已经宣布&#39;模板&#39;。 m_vect是vector类型。 Aaaand我不知道如何正确显示...
答案 0 :(得分:6)
值得庆幸的是,在C ++ 11中,你可以让编译器搞清楚。编译器已经知道m_vect是什么,所以你可以告诉它:
for (auto it= m_vect.begin(); ( it != m_vect.end()) ; ++ it ) { }
但等等,还有更多。在c ++ 11中,您甚至可以迭代m_vect
for (auto it : m_vect ) { }
你能否说我认为在C ++ 03中迭代是疯了,我从未在现实生活中看到过任何人这样做,而在C ++ 11中,它的表现要好上千倍?
答案 1 :(得分:1)
这似乎是在模板函数中,vector<T>::iterator
是一种依赖于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)
如果你读错了,你会发现这正是你的编译器告诉你的。
答案 2 :(得分:0)
T
需要是实际类型。它应该是存储在向量中的任何类型。您的for
循环看起来是正确的。你在某处宣称m_vect
。迭代器需要与您声明的m_vect
(当然还有::iterator
)相同的时间。
答案 3 :(得分:0)
这是编译器现在更好地执行的东西。
当您使用从模板派生的内容时,您必须通过添加typename
来标记它是否被用作类型。然后,如果编译器知道(出于某些疯狂的原因)vector<T>::iterator
是一个方法,它可以立即标记错误而不是前进到未定义的行为。
所以只需添加typename
,就像消息中所说:
for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it)
答案 4 :(得分:0)
如果你有足够的编译器,你可以用vector<T>::iterator
替换auto
。
否则,找到正确的类型来替换矢量的T
。