当我想为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;
}
任何帮助都将不胜感激。
答案 0 :(得分:4)
当您在模板中时需要使用typename
,并且需要引用依赖于该模板参数的类型。在您的代码中,iterator
是一种依赖于T
的类型,因此我们使用typename
。如果我们使用int
,我们就不需要typename
,因为该类型不依赖于模板参数:
std::vector<int>::iterator it;
the duplicate中详细说明了这一点。