代码使用 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.
}
本文指出编译器无法确定T
类型中的迭代器是类还是静态成员。所以我们必须使用typename
关键字来将符号分类为一个类型。
我的问题是,由于T
在编译时已知,因此编译器已经知道iterator
T 内部是一个类(在我的情况下是 T vector<int>
)。那么为什么会出现错误呢?
typename
除了将其用作定义模板参数之外,这也是关键字的另一种用途T
。
更新:
我从这里阅读了所有答案和其他答案,它们真正回答了我的所有想法。我可以总结为:
处理这个权利的正确编译器是 Gcc。VC++ 将允许您编译格式错误的代码。使用 Gcc 编译时产生的错误是由于语法分析,因为 Gcc 会尝试解析函数模板的代码,但它会发现语法错误,这是T::iterator it;
因为 Gcc by Deafault 将T::iterator
其视为变量(T::iterator
被解析为非type) 而不是作为类型,要解决此问题,您必须明确告诉 Gcc 将T::iterator
其视为类型,这是通过添加关键字来完成的typename
。
现在回到 VC++。为什么这个工作的答案是因为 VC++ 中存在的错误,这是 VC++ 是否延迟决定是否T::iterator
是变量或类型。或者 VC++typename
在它认为需要的地方提供关键字。
有用的文章
注意:如果您发现不正确的内容,请随时编辑更新。