C ++中“typename”的目的是什么?

时间:2010-08-17 14:34:55

标签: c++ templates typename

  

可能重复:
  Officially, what is typename for?

当我使用

template <typename TMap>
typename TMap::referent_type * func(TMap & map, typename TMap::key_type key) 
{ ... }

第二行上两个“typename”的目的是什么?

它似乎触发了编译时警告(VS2008:C4346),但它只是“你声称这是一种类型”吗?

即。在模板实例化时,实际检查TMap::referent_type是否实际是类型,但C ++标准似乎仍然存在要求,但正确解析的代码无法正常解析。

是否有任何实例需要使用typename来解决歧义?或者还有更多内容吗?

2 个答案:

答案 0 :(得分:4)

typename关键字告诉编译器,后面的任何标识符都是有效类型。这在模板中很重要,因为编译器可能还没有模板中使用的类型的定义,但您仍然希望能够使用该类型定义的一部分(例如,如上面的key_type)。如果您没有使用typename关键字,编译器会在该符号上输出错误,因为它不知道它是什么。当您使用模板实例作为模板参数时,这经常会发挥作用。

清除泥土?

答案 1 :(得分:0)

当您使用的类型依赖于其他内容时,您必须使用typename

在您的示例中,TMap::key_type依赖于模板参数,TMap::key_type可能是函数标识符或变量名称或其他任何内容......所以我们必须确保编译器是一个类型不是成员函数/变量。

另一方面,当我们使用的类型不依赖于其他模板时,我们不需要将其指定为typename