On 05/07/2013 07:19 PM, Bryan Catanzaro wrote:
Hi -
Using Boost 1.53.0, the following code fails to compile with g++, when c++11 is
enabled:
#include <boost/python.hpp>
#include <boost/variant.hpp>
struct A{}; struct B{};
typedef boost::variant<A, B> my_variant;
void foo(boost::python::object o) {
my_variant v = boost::python::extract<my_variant>(o);
}
The error is:
/home/bcatanzaro/boost_1_53_0/boost/variant/variant.hpp:1574:9: error: no matching function for call to
‘boost::variant<A, B>::initializer::initialize(void*,
std::remove_reference<boost::python::extract<boost::variant<A, B> >&>::type)’
Looking at the relevant line in boost/variant/variant.hpp, it looks like variant is
attempting to convert the boost::python::extract<my_variant> object into either A or
B, and failing to find a conversion. Since this code compiles when c++11 is not enabled, it
appears rvalue references coupled with boost::python::extract are confusing
boost::variant's constructor selection; I would expect it should be copy constructing from
variant<A, B>, rather than convert constructing into A or B.
Any advice or workarounds? Turning off c++11 is difficult, since the whole
project relies on it. The code compiles correctly with c++11 turned on with
Boost 1.48.0, so it appears something has regressed.
Hmm...maybe try this?
my_variant v = boost::python::extract<my_variant>(o)();
(note the extra parenthesis). Or this:
my_variant v = boost::python::extract<my_variant const &>(o)();
I haven't checked, but I'd be very surprised if the change between 1.48 and
1.53 was in Boost.Python, so that means you can probably reproduce it without
Boost.Python and maybe report it to the Boost.Variant people as a regression
there.
Jim
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig