为什么在函数体内使用`typename`

时间:2019-05-23 22:20:58

标签: c++ templates

我正在调查我正在使用的库的c ++源代码,完整的源代码here。我对c ++模板的工作原理有一个很清楚的了解,但是我不知道为什么要在函数体内使用类型名,即在下面的代码示例中,为什么要在{{1}之前放置typename }?

NB:不,我不认为这是重复的,这是一个特定的问题,目的是为了了解为什么在功能体内为给定功能使用unordered_map<Token*, BaseFloat>::const_iterator iter = final_costs.find(tok);。我注意到人们将其标记为重复,然后引用了通用模板问题,例如在何处/何时使用模板/类型名关键字,我已经浏览了提供的链接的信息,但是我在那里没有看到答案,所以如果标记为重复项,请具体说明为什么您认为它在这里回答了问题。

typename

上述功能的完整代码块:

template <typename FST>
typename LatticeFasterOnlineDecoderTpl<FST>::BestPathIterator LatticeFasterOnlineDecoderTpl<FST>::BestPathEnd(
...
.....
      typename unordered_map<Token*, BaseFloat>::const_iterator
          iter = final_costs.find(tok);
...
....

1 个答案:

答案 0 :(得分:1)

typename关键字不仅用于指定模板参数,还用于限定与相关的名称作为类型,而不是值。

如果编译器无法确定unordered_map<Token*, BaseFloat>::const_iterator是类型还是值,则假定它是值。在这种情况下情况并非如此。

因此,要说出它是一种类型,将使用关键字typename

here对此有明确解释。