当我想为向量声明迭代器时,为什么需要使用类型名?
例如:
typename vector<T>::iterator i;
Run Code Online (Sandbox Code Playgroud)
如果我删除关键字,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;
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
小智 5
typename当您位于模板内部并且需要引用依赖于该模板参数的类型时使用。在您的代码中,iterator是一种依赖于 的类型T,因此我们使用typename。如果我们使用,比如说,int我们就不需要typename,因为类型不依赖于模板参数:
std::vector<int>::iterator it;
Run Code Online (Sandbox Code Playgroud)
副本中对此进行了更详细的讨论。