I would have thought, naively enough, that one of the common uses of a
bimap was that one should be able to create a bimap from a std::map as
long as the relation between the two types was unique both ways. I was
disconcerted when I did not see a bimap constructor that accepted a
std::map of the same types, but then I saw the constructor which takes
two iterators and decided to try that, like so:
std::map<int,std::string> myMap;
// ... fill myMap
boost::bimap<int,std::string> myBimap(myMap.begin(),myMap.end());
I was met with, in VC9 using Boost 1.40:
"c:\utilities\boost\boost_1_40_0\boost\multi_index_container.hpp(232) :
error C2664: 'std::pair<_Ty1,_Ty2>
boost::multi_index::multi_index_container<Value,IndexSpecifierList,Allocator>::insert_(const
Value &,boost::multi_index::detail::ordered_index_node<Super> *)' :
cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'const
boost::bimaps::relation::mutant_relation<TA,TB,Info,force_mutable> &'
1> with
1> [
1>
_Ty1=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>,std::allocator<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>>>>>
*,
1> _Ty2=bool,
1>
Value=boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>,
1>
IndexSpecifierList=boost::bimaps::detail::bimap_core<int,TString,boost::mpl::na,boost::mpl::na,boost::mpl::na>::core_indices,
1>
Allocator=std::allocator<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>>,
1>
Super=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>,std::allocator<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>>>>
1> ]
1> and
1> [
1> _Ty1=const int,
1> _Ty2=TString
1> ]
1> and
1> [
1> TA=boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,
1> TB=boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,
1>
Info=boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,
1> force_mutable=true
1> ]
1> Reason: cannot convert from 'std::pair<_Ty1,_Ty2>' to 'const
boost::bimaps::relation::mutant_relation<TA,TB,Info,force_mutable>'
1> with
1> [
1> _Ty1=const int,
1> _Ty2=TString
1> ]
1> and
1> [
1> TA=boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,
1> TB=boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,
1>
Info=boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,
1> force_mutable=true
1> ]
1> No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called
1> c:\utilities\boost\boost_1_40_0\boost\bimap\bimap.hpp(247) :
see reference to function template instantiation
'boost::multi_index::multi_index_container<Value,IndexSpecifierList,Allocator>::multi_index_container<InputIterator>(InputIterator,InputIterator,const
boost::tuples::cons<HT,TT> &,const std::allocator<_Ty> &)' being compiled
1> with
1> [
1>
Value=boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>,
1>
IndexSpecifierList=boost::bimaps::detail::bimap_core<int,TString,boost::mpl::na,boost::mpl::na,boost::mpl::na>::core_indices,
1>
Allocator=std::allocator<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>>,
1>
InputIterator=std::_Tree<std::_Tmap_traits<int,TString,std::less<int>,std::allocator<std::pair<const
int,TString>>,false>>::iterator,
1>
HT=boost::tuples::tuple<boost::multi_index::member<boost::bimaps::relation::detail::relation_storage<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,true>,std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,pointer-to-member(0x4)>,std::less<std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>>>,
1>
TT=boost::tuples::cons<boost::tuples::tuple<boost::multi_index::member<boost::bimaps::relation::detail::relation_storage<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,true>,int,pointer-to-member(0x0)>,std::less<int>>,boost::multi_index::detail::index_base<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>,boost::bimaps::detail::bimap_core<int,TString,boost::mpl::na,boost::mpl::na,boost::mpl::na>::core_indices,std::allocator<boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>>>::ctor_args_list>,
1>
_Ty=boost::bimaps::relation::mutant_relation<boost::bimaps::tags::tagged<const
int,boost::bimaps::relation::member_at::left>,boost::bimaps::tags::tagged<const
std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>,boost::bimaps::relation::member_at::right>,boost::bimaps::detail::manage_additional_parameters<boost::mpl::na,boost::mpl::na,boost::mpl::na>::case_NNN::additional_info,true>
1> ]
1>
c:\programming\programs\vc9\xxx\current\yyyyyyyyyy\zzzzzzzzzzzzzzzz.cpp(338)
: see reference to function template instantiation
'boost::bimaps::bimap<KeyTypeA,KeyTypeB>::bimap<std::_Tree<_Traits>::iterator>(InputIterator,InputIterator)'
being compiled
1> with
1> [
1> KeyTypeA=int,
1> KeyTypeB=TString,
1>
_Traits=std::_Tmap_traits<int,TString,std::less<int>,std::allocator<std::pair<const
int,TString>>,false>,
1>
InputIterator=std::_Tree<std::_Tmap_traits<int,TString,std::less<int>,std::allocator<std::pair<const
int,TString>>,false>>::iterator
1> ]"
So evidently that does not work.
What is the problem with creating a bimap from the data in a std::map ?
It seems as if it should be a no-braine and one of the chief selling
points of using a bimap.