Boost logo

Boost Users :

Subject: [Boost-users] boost::container::vector fails to compile with C++03 compiler
From: mark pashley (mark.pashley_at_[hidden])
Date: 2012-10-26 04:47:55


The following example compiles fine when using GCC 4.4.6 with the --std=c++0x
flag but fails to compile in C++03 mode.

#include <stdint.h>
#include <boost/container/vector.hpp>

struct data
{
   int i_;
   boost::container::vector<data> v_;
};

int main( int argc, char** argv )
{
    data myData;
    myData.i_ = 10;

    data myData2;
    myData2.i_ = 30;

    myData.v_.push_back( myData2 );

    return 0;
}

It compiles successfully with

 g++ --std=c++0x test-cont.cpp

However if I remove the --std=c++0x I get the following errors: g++
test-cont.cpp In file included from include/c++/4.4.6/memory:49,
boost/container/container_fwd.hpp:36, boost/container/vector.hpp:20, from
test-cont.cpp:2:

include/c++/4.4.6/bits/stl_algobase.h: In static member function
    static _OI std::__copy_move<false, false,
std::random_access_iterator_tag>::
        __copy_m(_II, _II, _OI) [with _II =
            boost::container::constant_iterator<data, long int>, _OI =
data*]:

include/c++/4.4.6/bits/stl_algobase.h:397: instantiated from
    _OI std::__copy_move_a(_II, _II, _OI)
        [with bool _IsMove = false,
                   _II = boost::container::constant_iterator<data, long
int>, _OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:436: instantiated from
    _OI std::__copy_move_a2(_II, _II, _OI)
    [with bool _IsMove = false,
               _II = boost::container::constant_iterator<data, long int>,
_OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:468: instantiated from
    _OI std::copy(_II, _II, _OI)
        [with _II = boost::container::constant_iterator<data, long int>, _OI
= data*]

boost/move/move.hpp:1147: instantiated from
    boost::copy_or_move(I, I, F,
        typename boost::move_detail::disable_if<
boost::move_detail::is_move_iterator, void>::type*)
        [with I = boost::container::constant_iterator<data, long int>, F =
data*]

boost/container/detail/advanced_insert_int.hpp:58: instantiated from
    void boost::container::container_detail::advanced_insert_aux_proxy<A,
FwdIt, Iterator>::copy_remaining_to(Iterator)
    [with A = std::allocator<data>, FwdIt =
boost::container::constant_iterator<data, long int>, Iterator = data*]

test-cont.cpp:21: instantiated from here

include/c++/4.4.6/bits/stl_algobase.h:343: error:
    no match for operator= in * __result =
        __first.boost::container::constant_iterator<T,
Difference>::operator*
        [with T = data, Difference = long int]()

test-cont.cpp:5: note: candidates are: data& data::operator=(data&)

It looks like boost::container::vector requires move semantics which I
assumed would automatically use boost::move when compiled with a c++03
compiler.

If I manually modify the struct data to define:

a default constructor
a copy constructor
an assignment operator
an emulated move constructor using BOOST_RV_REF
an emulated move assignment operator using BOOST_RV_REF

The example compiles.

Having to manually add these move/copy constructors and assignment operators
for C++03 is laborious.

Is this a bug with boost::container?

--
View this message in context: http://boost.2283326.n4.nabble.com/boost-container-vector-fails-to-compile-with-C-03-compiler-tp4637650.html
Sent from the Boost - Users mailing list archive at Nabble.com.

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net