开发者

Can we access typedef'ed types via an instance?

I wondered,

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

Why am I not able to 开发者_如何学Gowrite this as:

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

Of course, typedeffing the map would make the first code less verbose - but that is not my point. The compiler knows the type of mymap, so why not let it resolve mymap::iterator? Is there a reason why iterator is not accessible via the instance?


:: is a scope resolution operator that expects type name or namespace name on the left-hand side. It doesn't accept object names on the left-hand side. Allowing this would probably overcomplicate a lot of things in the language.

In fact, if one would to allow something like this, one'd probably attach this functionality to . operator, since . operator is the one used with objects on the LHS

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

But this still would unnecessarily overcomplicate things anyway.

In the future C++ standard something like that will become possible through decltype keyword

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

P.S. According to Wikipedia article on decltype, its availability in qualified-ids was a matter of debate. If I understood it correctly, this usage was eventually voted in.

P.P.S. Also, as @Asha noted in comments, in the future C++ you'll be able to avoid naming the type at all

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


That iterator is a type which is defined in the scope of map and not part of objects created from map.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜