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

pet*_*hen 2 c++ templates typename

可能的重复:
正式地说,typename 是什么?

当我使用

template <typename TMap>
typename TMap::referent_type * func(TMap & map, typename TMap::key_type key) 
{ ... }
Run Code Online (Sandbox Code Playgroud)

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

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

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

有没有实际需要类型名来解决歧义的例子?或者还有更多吗?

Ben*_*ins 5

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

清如泥?