带模板的c ++迭代器

时间:2014-01-01 08:35:03

标签: c++ iterator

我有一个关于如何在模板方式下使用迭代器的问题 这是我要做的一个例子,问题是,在for循环中如何初始化迭代器pp?

我读过类似的问题,但我不能完全理解,因为我是初学者 What should the iterator type be in this C++ template?
任何人都可以提供帮助并提供一些简单的解释吗?

#include <iostream>
#include <vector>

template <class T>
void my_print(std::vector<T> input){
    for(std::vector<T>::iterator pp = input.begin(); pp != input.end(); ++pp)
        std::cout << *pp << "\n";
}
int main(int argc,char* argv[]){
    std::vector<int> aa(10,9);
    my_print(aa);

    return 0;
}

我收到错误消息:
'std :: vector :: iterator'被解析为非类型,但实例化产生类型

2 个答案:

答案 0 :(得分:17)

typename

之前添加iterator
#include <iostream>
#include <vector>

template <class T>
void my_print(std::vector<T> input)
{
    for (typename std::vector<T>::iterator pp = input.begin(); pp != input.end(); ++pp)
    {
        std::cout << *pp << "\n";
    }
}
int main(int argc, char* argv[])
{
    std::vector<int> aa(10, 9);
    my_print(aa);

    return 0;
}

来源:http://www.daniweb.com/software-development/cpp/threads/187603/template-function-vector-iterator-wont-compile

答案 1 :(得分:4)

就像迪特说的那样,新版本的gcc几乎可以告诉你需要哪个typename:

error: need 'typename' before 'std::vector<T>::iterator' 
       because 'std::vector<T>' is a dependent scope

简单修复:

for(typename std::vector<T>::iterator pp = input.begin(); 
          pp != input.end(); ++pp)

以下是Error with T::iterator, where template parameter T might be vector<int> or list<int>

的解释
  

在合格的依赖类型之前,您需要typename。没有   typename,有一个C ++解析规则,说明合格   依赖名称应解析为非类型,即使它导致a   语法错误。

如需更全面的解释,请查看Why is the keyword "typename" needed before qualified dependent names, and not before qualified independent names?