为什么在声明向量迭代器时使用typename关键字?

时间:2014-04-26 20:30:59

标签: c++ typename

当我想为vector声明迭代器时,为什么我需要使用typename?

例如:

typename vector<T>::iterator i;

如果我删除typename的关键字,那么该程序根本不起作用。我写的是:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

template <class T>

class MyClass
{
  private:
    vector<T>  array;

  public:
    MyClass ( T * begin,int n ) : array(n)
    {
      copy( begin, begin + n, array.begin());
    }

    void List()
    {
      typename vector<T>::iterator i;
      for( i = array.begin(); i != array.end(); ++i )
        cout << * i << "," ;
    }   
};


int main()
{
  string array[4] = { "Tom","Jack","Mary","John"};
  MyClass<string>obj(array,4);
  obj.List();
  return 0;
} 

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

当您在模板中时需要使用typename,并且需要引用依赖于该模板参数的类型。在您的代码中,iterator是一种依赖于T的类型,因此我们使用typename。如果我们使用int,我们就不需要typename,因为该类型不依赖于模板参数:

std::vector<int>::iterator it;

the duplicate中详细说明了这一点。