代码:
template <class T>
void f(){
T::iterator a; // will work using Gcc if we add typename
//...
}
上面的代码将使用MSVC ++,并且无法使用gcc,因为MSVC ++将延迟解析。我知道模板定义时的编译器只会对非依赖名称执行查找,并且由于T::iterator
显然取决于T,为什么查找发生在模板定义时?
答案 0 :(得分:3)
没有。在实例化时查找从属名称。在定义时,它仅检查依赖名称的语法错误等。 typename关键字用于帮助编译器解析表达式。
答案 1 :(得分:0)
typename
关键字的目的是允许编译器推迟查找。因此,它仅用于在模板定义时发生不的上下文中。
查找将解析名称是类型还是对象,这是检查模板定义语法所必需的。 typename
明确指定了这一点。如果没有typename
关键字,则编译器会假定它是一个对象,用于语法目的。
查询实例化时,必须在且仅当typename
应用于从属名称时才能找到类型。