Opened 8 years ago
Closed 6 years ago
#10278 closed Bugs (fixed)
variant c2666, wrong constructor?
Reported by: | Owned by: | Antony Polukhin | |
---|---|---|---|
Milestone: | Boost 1.62.0 | Component: | variant |
Version: | Boost 1.55.0 | Severity: | Problem |
Keywords: | Cc: |
Description
VC Express 2012, 11.0.61030.00 Update 4
When I use variant<variant<A,B>,C> it's working, but with variant<deriver_from_other_variant,...> it's not. I think it's because of wrong variant constructor called (like we construct from variant<some types>, but not from just V1). Workaround for me is to use variant<class_that_has_V1_as_member_var,...>.
class V1 : public boost::variant<float,double> { typedef boost::variant<float,double> base_type; public: V1() { } V1( const V1& other ) :base_type( static_cast<const base_type&>(other) ) { } V1& operator=( const V1& other ) { static_cast<base_type&>(*this) = static_cast<const base_type&>(other); return *this; } }; boost::variant<V1,std::string> v2 = V1(); // C2666
Full error text:
error C2666: 'boost::variant<T0_,T1>::convert_construct' : 3 overloads have similar conversions 1> with 1> [ 1> T0_=V1, 1> T1=std::string 1> ] 1> f:\cpp\boost\boost/variant/variant.hpp(1724): could be 'void boost::variant<T0_,T1>::convert_construct<float,double,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_>(boost::variant<float,double> &&,long)' 1> with 1> [ 1> T0_=V1, 1> T1=std::string 1> ] 1> f:\cpp\boost\boost/variant/variant.hpp(1714): or 'void boost::variant<T0_,T1>::convert_construct<float,double,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_,boost::detail::variant::void_>(const boost::variant<float,double> &,long)' 1> with 1> [ 1> T0_=V1, 1> T1=std::string 1> ] 1> f:\cpp\boost\boost/variant/variant.hpp(1600): or 'void boost::variant<T0_,T1>::convert_construct<V1>(T &&,int,boost::mpl::false_)' 1> with 1> [ 1> T0_=V1, 1> T1=std::string, 1> T=V1 1> ] 1> while trying to match the argument list '(V1, long)' 1> test.cpp(31) : see reference to function template instantiation 'boost::variant<T0_,T1>::variant<V1>(T &&,void *,void *)' being compiled 1> with 1> [ 1> T0_=V1, 1> T1=std::string, 1> T=V1 1> ] 1> test.cpp(31) : see reference to function template instantiation 'boost::variant<T0_,T1>::variant<V1>(T &&,void *,void *)' being compiled 1> with 1> [ 1> T0_=V1, 1> T1=std::string, 1> T=V1 1> ]
Change History (2)
comment:1 by , 6 years ago
Milestone: | To Be Determined → Boost 1.62.0 |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:2 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Note:
See TracTickets
for help on using tickets.
Fixed in d23cdd35 develop, will be merged to master branch as soon as the tests will cycle.