constな ptr_mapを BOOST_FOREACHで回そうとするとエラーになる。
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>
int main()
{
typedef boost::ptr_map<int,int> intp_map;
const intp_map map;
BOOST_FOREACH(const intp_map::value_type &c,map){
}
return 0;
}
「boost::ptr_container_detail::ref_pair
VC2005だと以下のように変更して OKだったのに対し…
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>
int main()
{
typedef boost::ptr_map<int,int> intp_map;
const intp_map map;
BOOST_FOREACH(intp_map::const_iterator::value_type &c,map){
}
return 0;
}
gccでは以下のように constを指定する必要があった。*1
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>
int main()
{
typedef boost::ptr_map<int,int> intp_map;
const intp_map map;
BOOST_FOREACH(const intp_map::const_iterator::value_type &c,map){
}
return 0;
}
こちらの表記とどちらが正しいのかは…
#include <boost/ptr_container/ptr_map.hpp>
#include <boost/foreach.hpp>
int main()
{
typedef boost::ptr_map<int,int> intp_map;
const intp_map map;
BOOST_FOREACH(const intp_map::iterator::value_type &c,map){
}
return 0;
}
何にしろ、ptr系のコンテナって実体がポインタなのに参照に見せようとする小細工をしているからあちこちで歪みが出てくるんだよな。
*1 意味的にはこちらの方が正しそうだし、VCでもこちらの表記は通るのでこちらで統一することに。