2010-08-17 91 views
1

可能重复的目的:
Officially, what is typename for?什么是C “类型名称” ++

当我使用

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

什么是两者的目的“类型名“在第二行?

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

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

是否有任何实例需要typename来解决歧义?或者还有更多呢?

+0

我必须承认,对于C++标签的人会提出这样一个关于模板编程的基本问题,我们必须承认会有点吃惊。你有没有编译过比Visual Studio更好的编译器? (如,更符合标准) – 2010-08-17 14:56:53

+0

@Mathieu:我已经使用了Watcom C++ 9.0-10.5,“观察”了C++的更精细的细节,并且我用Comeau进行了一些测试 - 尽管从未在生产中。 VS的失控在这里真的值得吗? ---我缺少的关键洞察是'T :: SubType * p'会被解析为算术表达式。 ---我没有注意到我有一个C++标签,但我确实知道C++每个月大概还是让我感到惊讶。 – peterchen 2010-08-17 15:06:18

回答

4

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

清澈如泥?

+0

+1 - 为了(希望)在模板中澄清一点,如果你有Shape :: type,编译器无法辨别type是否为“类型”,或者它是Shape中的变量/枚举。使用typename限定符允许您告诉编译器这是一个“类型”。 – 2010-08-17 14:47:23

0

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

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

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

相关问题