閉じる

boost::ptr_mapと BOOST_FOREACH

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」から「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でもこちらの表記は通るのでこちらで統一することに。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)