2013-12-10 73 views
0

一个Vector因此,基于我找到其他例子,我带领相信,这将是正确的代码来遍历m_vect:迭代在C++

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 

就像我说的,我复制和改编自另一块的代码行,所以我真的不知道我在做什么对与错。任何见解?

澄清,这是在一个模板函数中,我已经声明'模板'。 m_vect是矢量类型的。 Aaaand我不知道如何显示小于和大于正常...

+1

什么是T?我认为你需要一个真正的类型而不是'T'。看看你为矢量<>定义的类型。 – woolstar

+0

如何定义m_vect? – Naveen

+0

上下文很重要。 –

回答

1

这似乎在模板函数中,并且vector<T>::iterator是一种依赖于T的类型,它是一个模板参数。由于模板可以专用于任何不同类型的唯一定义,编译器无法确定,直到模板实际实例化,vector<T>::iterator是否为类型或静态成员。如果它是一个静态成员,这并没有任何意义,语法:

for(vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it) 

你需要做的是告诉compliler即vector<T>::iterator是一种类型。使用typename为:

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it) 

如果你读了你的错误,你可以看到,这正是你的编译器告诉你。

+0

我想它是。:|我想我只是觉得奇怪 – Blab

+0

@TheBlab你应该拥有它,无论你有什么'class :: type',其中'T'是一个模板。 –

0

T需要是一个实际的类型。它应该是存储在向量中的任何类型。您的for循环看起来正确。你在某处宣布m_vect。迭代器需要与您声明m_vect(当然加上::iterator)相同的时间。

+0

不应该声明'模板'是否足够? – Blab

+0

不。当你声明变量'it'时,你必须告诉编译器你期望它有什么类型。 (尽管参见上面的@ woolstar的答案 - 显然C++ 11使它更容易。) – user1118321

+0

您不能制作'T'的容器。他们必须是**真正**的容器。就像'int'一样。所以迭代器也需要一种类型的东西。 – woolstar

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 – user1810087

+0

我真的很喜欢这里所说的简单,但我的编译器似乎并不认同。 :/ – Blab

+1

@woolstar:我知道在每次我强迫自己输入C++ 98/C++ 03的方式时,我都强迫自己学习STL ...... C++标准库。我经常在typedefs背后隐藏这些迭代器咒语,以防止手指脱落。自1992年以来我一直在编程C,而在此之前我一直在编程C,它只是杀死了我的敏感性。我不能等到C++ 11在环境中得到支持,而我仍然在编程实质上是“带类的C”。我听说我们可能会在几年内得到它... –

0

这是编译器正在执行的更好的东西。

当您使用从模板派生的东西时,必须通过添加typename来标记它是否被用作类型。然后如果编译器知道(出于某种疯狂的原因)vector<T>::iterator是一种方法,它可以立即标记错误而不是进入未定义的行为。

所以只需添加typename像有消息称:

for(typename vector<T>::iterator it = m_vect.begin(); it != m_vect.end(); ++it) 
0

如果你有足够的amodern编译器,你可以用auto取代vector<T>::iterator

否则,找到正确的类型替换为您的向量的T