我们可以通过实例访问typedef'ed类型吗?

时间:2011-03-10 07:32:32

标签: c++ types

我想知道,

for(std::map<int, double, std::greater<int> >::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
   //do stuff
}

为什么我无法将其写为:

for(mymap::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
    //do stuff
} 

当然,对地图进行类型设置会使第一个代码更简洁 - 但这不是我的观点。编译器知道mymap的类型,那么为什么不让它解析mymap::iterator?是否有理由无法通过实例访问iterator

2 个答案:

答案 0 :(得分:12)

::是一个范围解析运算符,它在左侧需要类型名称或命名空间名称。它不接受左侧的对象名称。允许这可能会使语言中的许多内容过于复杂。

事实上,如果允许这样的事情,可能会将此功能附加到.运算符,因为.运算符是与LHS上的对象一起使用的运算符

for (mymap.iterator it = mymap.begin(); it != mymap.end(); ++it) 

但无论如何,这仍然会使事情过于复杂化。

在未来的C ++标准中,通过decltype关键字

可以实现类似的功能
for (decltype(mymap)::iterator it = mymap.begin(); it != mymap.end(); ++it) 

P.S。根据维基百科关于decltype的文章,它在合格ID中的可用性是一个有争议的问题。如果我理解正确,这种用法最终会被投票。

P.P.S。另外,正如@Asha在评论中指出的那样,在将来的C ++中,你将能够避免命名类型

for (auto it = mymap.begin(); it != mymap.end(); ++it) 

答案 1 :(得分:1)

迭代器是一种在地图范围内定义的类型,而不是从地图创建的对象的一部分。