当我使用
时template <typename TMap>
typename TMap::referent_type * func(TMap & map, typename TMap::key_type key)
{ ... }
第二行上两个“typename”的目的是什么?
它似乎触发了编译时警告(VS2008:C4346),但它只是“你声称这是一种类型”吗?
即。在模板实例化时,实际检查TMap::referent_type
是否实际是类型,但C ++标准似乎仍然存在要求,但正确解析的代码无法正常解析。
是否有任何实例需要使用typename来解决歧义?或者还有更多内容吗?
答案 0 :(得分:4)
typename
关键字告诉编译器,后面的任何标识符都是有效类型。这在模板中很重要,因为编译器可能还没有模板中使用的类型的定义,但您仍然希望能够使用该类型定义的一部分(例如,如上面的key_type
)。如果您没有使用typename
关键字,编译器会在该符号上输出错误,因为它不知道它是什么。当您使用模板实例作为模板参数时,这经常会发挥作用。
清除泥土?
答案 1 :(得分:0)
当您使用的类型依赖于其他内容时,您必须使用typename
。
在您的示例中,TMap::key_type
依赖于模板参数,TMap::key_type
可能是函数标识符或变量名称或其他任何内容......所以我们必须确保编译器是一个类型不是成员函数/变量。
另一方面,当我们使用的类型不依赖于其他模板时,我们不需要将其指定为typename
。