代码之家  ›  专栏  ›  技术社区  ›  peterchen

C++中的“类型名称”的目的[复制]

  •  1
  • peterchen  · 技术社区  · 15 年前

    可能重复:
    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++标准的要求,但是代码被正确地解析了。

    是否有任何实例实际需要类型名来解决歧义?或者还有别的吗?

    2 回复  |  直到 15 年前
        1
  •  4
  •   Ben Collins    15 年前

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

    清澈如泥?

        2
  •  0
  •   Sadeq    15 年前

    你必须使用 typename 当您使用的类型依赖于另一个对象时。

    在你的例子中, TMap::key_type 依赖于模板参数和 TMap:KEYY型 可以是函数标识符、变量名或其他任何东西…所以我们必须确保编译器是一个类型而不是成员函数/变量。

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