class A
{
static int iterator;
class iterator
{
[...]
};
[...]
};
我想我理解为什么这里需要typename
:
template <class T>
void foo() {
typename T::iterator* iter;
[...]
}
但是我不明白为什么这里不需要使用typename
:
void foo() {
A::iterator* iter;
[...]
}
能有人解释一下吗?
编辑:
我发现编译器不会对后者产生问题的原因,在评论中得到了很好的回答:
在A::iterator
的情况下,我不明白编译器为什么不会将其与static int iterator
混淆? - xcrypt
@xcrypt 因为它知道两个A::iterator
的含义,并且可以根据使用场合选择其中一个 - Seth Carnegie
我认为编译器在限定依赖名之前需要typename
的原因,在Kerrek SB的被接受的答案中得到了很好的解释。请务必阅读该答案的评论,特别是iammilind的评论:
"T::A * x;,这个表达式可能对于T::A既是类型又是值的情况都成立。如果A是一个类型,则它将导致指针声明;如果A是一个值,则它将导致乘法。因此,一个模板将对2种不同类型具有不同的含义,这是不可接受的。"