【发布时间】:2012-08-03 01:27:41
【问题描述】:
代码是使用 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.
}
This article 指出编译器无法确定T 类型中的迭代器是类还是静态成员。所以我们必须使用typename关键字来将符号分类为一个类型。
我的问题是,因为 T 在编译时是已知的,那么编译器已经知道 T 内部的 iterator 是一个类(在我的例子中,T 是 vector<int>)。那么为什么会出现错误呢?
这也是typename 关键字的另一种用法,除了将其用作定义模板参数T。
更新:
我阅读了 here 的所有答案和其他答案,它们确实回答了我的所有想法。我可以总结为:
处理这个权利的正确编译器是 Gcc。 VC++ 将允许您编译格式错误的代码。使用 Gcc 编译时出现的错误是由于语法分析造成的,因为 Gcc 会尝试解析函数模板的代码,但会发现语法错误 T::iterator it;,因为 Deafault 的 Gcc 将 T::iterator 视为变量(T::iterator 被解析为非类型)而不是类型,要解决此问题,您必须明确告诉 Gcc 将 T::iterator 视为类型,这是通过添加关键字 typename 来完成的。
现在回到 VC++。为什么这个工作的答案是因为 VC++ 中存在的错误,VC++ 是否延迟了T::iterator 是变量还是类型的决定。或者 VC++ 在它认为需要的地方提供关键字 typename。
Useful Article
注意:如果您发现不正确的内容,请随时编辑更新。
【问题讨论】:
-
你能提供文章的链接吗? this one 或 this other one 怎么样?
-
在 VS2010 中编译并运行良好。
-
@chrisaycock : codeproject.com/Articles/268849/…
-
@Aesthete :是的,我忘了提到它可以与 VC++ 和一些编译器一起使用,但在 Gcc 和其他编译器中,不会工作。
-
@AlexDan 这是一篇很长的文章。你指的是那篇文章的哪个地方?