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

nak*_*iya 8 c++ types

我想知道,

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

为什么我不能写这个:

for(mymap::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
    //do stuff
} 
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 12

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

实际上,如果允许这样的东西,可能会将此功能附加到.操作符,因为.操作符是与LHS上的对象一起使用的操作符

for (mymap.iterator it = mymap.begin(); it != mymap.end(); ++it) 
Run Code Online (Sandbox Code Playgroud)

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

在未来的C++标准中,类似的东西将通过decltype关键字成为可能

for (decltype(mymap)::iterator it = mymap.begin(); it != mymap.end(); ++it) 
Run Code Online (Sandbox Code Playgroud)

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

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

for (auto it = mymap.begin(); it != mymap.end(); ++it) 
Run Code Online (Sandbox Code Playgroud)

  • @ 0xC0DEFACE:我指的是OP的`mymap`.OP的`mymap`是一个对象,而不是typedef名称. (2认同)