Opened 17 years ago

Closed 16 years ago

#592 closed Bugs (None)

ambiguous overloads in boost::variant source code

Reported by: nobody Owned by: ebf
Milestone: Component: None
Version: None Severity:
Keywords: Cc:

Description

I cannot figure out, why the following little program
does not compile. It simply typedefs a variant of a
specific bounded type set and then derives a class from
this type. I've tried to compile it with VC 2005. It
does not compile because of ambiguous overloads within
the boost::variant source.

It would be very helpful if somebody could shed light
on the issue.

Best regards
Peter

PS: I intended to post this to the boost developers
list, but I was unable to log onto the list today.


*************************************************************


#include <boost/variant.hpp>

typedef boost::variant<char, int, double>
numeric_type_variant;

class numeric_type
	: public numeric_type_variant
{
public:
	/// Default constructor.
	numeric_type() : numeric_type_variant() { }

	template <typename T>
	/// Converting constructor.
	numeric_type(T const& t) : numeric_type_variant(t) { }

	// some more code
};


int main(int argc, char* argv[])
{
	char ba;
	int bb;
	double bc;

	numeric_type a;	
	numeric_type b(ba);	
	numeric_type c(bb);	
	numeric_type d(bc);	

	a = ba;
	a = bb;
	a = bc;

	return 0;
}


*************************************************************


This is the build log:

------ Build started: Project: test_variant,
Configuration: Debug Win32 ------ Compiling...
test_variant.cpp
c:\_ngi\toolkits\boost_1_33_1\boost\variant\variant.hpp(1342)
: error C2666:
'boost::variant<T0_,T1,T2>::convert_construct' : 2
overloads have similar conversions
        with
        [
            T0_=char,
            T1=int,
            T2=double
        ]
       
c:\_ngi\toolkits\boost_1_33_1\boost\variant\variant.hpp(1327):
could be 'void
boost::variant<T0_,T1,T2>::convert_construct<char,int,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_>(const
boost::variant<T0_,T1,T2> &,long)'
        with
        [
            T0_=char,
            T1=int,
            T2=double
        ]
       
c:\_ngi\toolkits\boost_1_33_1\boost\variant\variant.hpp(1258):
or 'void
boost::variant<T0_,T1,T2>::convert_construct<const T>(T
&,int,boost::mpl::false_)'
        with
        [
            T0_=char,
            T1=int,
            T2=double,
            T=numeric_type
        ]
        while trying to match the argument list '(const
numeric_type, long)'
       
c:\_ngi\toolkits\boost_1_33_1\boost\variant\variant.hpp(1580)
: see reference to function template instantiation
'boost::variant<T0_,T1,T2>::variant<T>(const T &)'
being compiled
        with
        [
            T0_=char,
            T1=int,
            T2=double,
            T=numeric_type
        ]
       
c:\_ngi\toolkits\boost_1_33_1\boost\variant\variant.hpp(1590)
: see reference to function template instantiation
'void boost::variant<T0_,T1,T2>::assign<T>(const T &)'
being compiled
        with
        [
            T0_=char,
            T1=int,
            T2=double,
            T=numeric_type
        ]
       
c:\_schrott\test_variant\test_variant\test_variant.cpp(36)
: see reference to function template instantiation
'boost::variant<T0_,T1,T2>
&boost::variant<T0_,T1,T2>::operator
=<numeric_type>(const T &)' being compiled
        with
        [
            T0_=char,
            T1=int,
            T2=double,
            T=numeric_type
        ]
Build log was saved at
"file://c:\_schrott\test_variant\test_variant\Debug\BuildLog.htm"
test_variant - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date,
0 skipped ==========

Change History (2)

comment:1 by Steven Watanabe, 16 years ago

Logged In: YES 
user_id=1671606
Originator: NO

This is an MSVC bug.  You need to add:

    numeric_type(const numeric_type& other) :
        numeric_type_variant(static_cast<const numeric_type_variant&>(other)) {}
    numeric_type& operator=(const numeric_type& other) {
        *static_cast<numeric_type_variant*>(this) = static_cast<const numeric_type_variant&>(other);
        return(*this);
    }

MSVC incorrectly generates:

    numeric_type(const numeric_type& other) :
        numeric_type_variant(other) {}
    numeric_type& operator=(const numeric_type& other) {
        *static_cast<numeric_type_variant*>(this) = other;
        return(*this);
    }

comment:2 by ebf, 16 years ago

Status: assignedclosed
Note: See TracTickets for help on using tickets.