1

代码:

template <class T>
void f(){
T::iterator a; // will work using Gcc if we add typename
//...
}

上面的代码使用 MSVC++ 可以工作,使用 gcc 不能工作,因为 MSVC++ 会延迟解析。
我知道模板定义时的编译器只会对非依赖名称执行查找,并且由于T::iterator显然依赖于 T,为什么查找发生在模板定义时?

4

2 回答 2

4

它没有。在实例化时查找从属名称。在定义时,它只检查依赖名称的语法错误等。typename 关键字用于帮助编译器解析表达式。

于 2012-08-10T04:16:15.673 回答
0

关键字的目的typename是允许编译器延迟查找。因此,它仅在模板定义时不发生查找的上下文中使用。

查找将解析名称是类型还是对象,这是检查模板定义的语法所必需的。typename明确指定这一点。如果没有typename关键字,则出于语法目的,编译器假定它是一个对象。

当且仅当typename应用于从属名称时,实例化时的查找必须找到一个类型。

于 2012-08-10T04:31:58.457 回答