我正在调查我正在使用的库的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);
...
....
答案 0 :(得分:1)
typename
关键字不仅用于指定模板参数,还用于限定与相关的名称作为类型,而不是值。
如果编译器无法确定unordered_map<Token*, BaseFloat>::const_iterator
是类型还是值,则假定它是值。在这种情况下情况并非如此。
因此,要说出它是一种类型,将使用关键字typename
。
here对此有明确解释。