【问题标题】:What is the purpose of "typename" in C++ [duplicate]C ++中“类型名”的目的是什么[重复]
【发布时间】:2011-03-31 00:50:30
【问题描述】:

可能重复:
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++ 标准似乎仍然有要求,但无论代码是否正确解析。

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

【问题讨论】:

  • 我必须承认有点惊讶,一个带有 C++ 标签的人会问这样一个关于模板编程的基本问题。您是否曾经使用比 Visual Studio 更好的编译器进行编译? (如,更符合标准)
  • @Mathieu:我使用过 Watcom C++ 9.0-10.5,“观察”C++ 更精细的细节在其中栩栩如生,并且我使用 Comeau 进行了一些测试——尽管从未投入生产。这里真的值得鄙视 VS 吗? --- 我缺少的关键见解是 T::SubType * p 将被解析为算术表达式。 --- 我没有注意到我有一个 C++ 标签,但我知道 C++ 仍然大约每月一次让我感到惊讶。

标签: c++ templates typename


【解决方案1】:

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

清如泥?

【讨论】:

  • +1 - (希望)澄清一点,在模板中,如果你有 Shape::type,编译器无法辨别类型是“类型”还是变量/ Shape 中的枚举。使用 typename 限定符可以告诉编译器这是一个“类型”。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 2015-09-05
    • 2019-01-25
    • 2013-05-01
    • 2011-07-05
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    相关资源
    最近更新 更多