在函数模板中创建一个包含迭代器

Ale*_*Dan 5 c++ templates iterator

代码使用GCC编译.这项工作在VC++中没有任何错误

template <typename T>
void Function(T& A){

  T::iterator it; //Error : dependent-name 'T::iterator' is parsed as a non-type,
                  //but instatiation yields a type.
}
Run Code Online (Sandbox Code Playgroud)

本文指出编译器无法弄清楚T类型中的迭代器是类还是静态成员.因此,我们必须使用typename关键字将符号分类为类型.

我的问题是,因为T在编译时已知,然后编译器已经知道iteratorT内部是一个类(在我的例子中是T vector<int>).那么为什么会有错误呢?

这也是typename关键字的另一种用途,旁边使用它来定义模板参数T.

更新:

我从这里读了所有答案和其他答案,真正回答了我的所有想法.我可以总结一下:

处理这个权利的正确编译器是Gcc.VC++将允许您编译格式错误的代码.使用Gcc编译时产生的错误是由于语法分析,因为Gcc将尝试解析函数模板的代码,但它会发现语法错误,这是T::iterator it;因为Deafault的Gcc将其T::iterator视为变量(T::iterator被解析为非变量)为了解决这个问题,你必须明确告诉Gcc将其T::iterator视为一种类型,这是通过添加关键字来完成的typename.
现在回到VC++.为什么这有效的答案是因为VC++中存在的错误,VC++是否会延迟决定T::iterator是变量还是类型.或VC++提供typename它认为必要的关键字.


有用的文章
注意:如果您发现不正确的内容,随意编辑更新.

chr*_*ock 2

您参考的文章提供了解释:

必须告诉编译器指定的符号实际上是一种类型,而不是给定类的静态符号。

考虑本文中的一个例子:

class ContainsAType {
   class iterator { ... }:
   ...
};

class ContainsAValue {
   static int iterator;
};
Run Code Online (Sandbox Code Playgroud)

所以在Function()上面,编译器必须知道它T::iterator是类型还是静态变量。该typename关键字消除了 C++ 中的歧义。