Question

I tried copying the elements of a std::map into a boost::bimap. I cannot get std::copy to work (the boost documentation seems to indicate that bimap should be compatible with std::copy).

I tried the following:

std::map<K, T> curves;

boost::bimap<boost::bimaps::set_of<K>,
    boost::bimaps::multiset_of<T>> m_curves;

... // some initialisation of curves

std::copy(curves.begin(), curves.end(), std::inserter(m_curves, 
    m_curves.end())); // This fails

m_curves.insert(curves.begin(), curves.end()); // This fails too !

The error message is quite long and starts with:

1>C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\xutility(2266) : error C2679: binary '=' : no operator found which takes a right-hand operand of type 'const std::pair<_Ty1,_Ty2>' (or there is no acceptable conversion)
1>        with
1>        [
1>            _Ty1=const K,
1>            _Ty2=std::string
1>        ]
1>        C:\Program Files (x86)\Microsoft Visual Studio 8\VC\include\iterator(129): could be 'std::insert_iterator<_Container> &std::insert_iterator<_Container>::operator =(const boost::bimaps::relation::mutant_relation<TA,TB,Info,force_mutable> &)'
1>        with
1>        [
1>            _Container=Focus::BMpCrvKeyToName,
1>            TA=boost::bimaps::tags::tagged<const K,boost::bimaps::relation::member_at::left>,
1>            TB=boost::bimaps::tags::tagged<const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,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=false
1>        ]
Was it helpful?

Solution

A bimap itself isn't signature-compatible with map, but the left view is. Try inserting into m_curves.left:

m_curves.left.insert(curves.begin(), curves.end());
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top