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
在编译时已知,然后编译器已经知道iterator
T内部是一个类(在我的例子中是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
它认为必要的关键字.
有用的文章
注意:如果您发现不正确的内容,请随意编辑更新.
您参考的文章提供了解释:
必须告诉编译器指定的符号实际上是一种类型,而不是给定类的静态符号。
考虑本文中的一个例子:
class ContainsAType {
class iterator { ... }:
...
};
class ContainsAValue {
static int iterator;
};
Run Code Online (Sandbox Code Playgroud)
所以在Function()
上面,编译器必须知道它T::iterator
是类型还是静态变量。该typename
关键字消除了 C++ 中的歧义。
归档时间: |
|
查看次数: |
198 次 |
最近记录: |