模板中的依赖名称和非依赖名称

时间:2012-08-10 04:08:35

标签: c++ templates gcc

代码:

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

查询实例化时,必须在且仅当typename应用于从属名称时才能找到类型。