Sorry, in the error message you will read the type name discriminated_union.
This is the real type name, think of it as my_class.
Thanks and sorry again,
Ovanes
_____
From: Ovanes Markarian [mailto:om_boost@keywallet.com]
Sent: Sunday, June 25, 2006 23:18
To: 'boost-users@lists.boost.org'
Subject: Strange compiler behaviour with mpl::vector
Hello all!
I posted the following message
http://lists.boost.org/boost-users/2006/06/20271.php a few days ago, but did
not get any replies.
I know there is an error in the const_ref class. But nevertheless the
problem which occures is that my class accepts a vector of supported types
as template parameter.
It has two constructors (no default ctor):
template<class Seq_>
class my_class
{
public:
typedef my_class this_type;
explicit inline my_class(const this_type& copy_from) :... {...}
template<class TypeFromVector>
explicit inline my_class(typename const_ref<TypeFromVector>::type
inst) :... {...}
};
Now if I try to initialize my_class with type declared in vector I get an
error:
error C2664: 'discriminated_union::discriminated_union(const
discriminated_union &)' : cannot convert parameter 1 from 't1' to
'const discriminated_union &'
with
[
Seq_=types_vector
]
Reason: cannot convert from 't1' to 'const
discriminated_union'
with
[
Seq_=types_vector
]
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
Ok, if I define the ctor param without typename const_ref<...>::type
everything goes fine, if I use const_ref it fails. const_ref is defined as
follows:
template<class Ty>
struct const_ref
: boost::add_reference
<
typename boost::add_const
<
typename boost::remove_reference<Ty>::type
::type
{};
I can understand that the compiler is unable to make a decision which ctor
to use, but I do not get an ambiguaty error. It seems like the compiler
simply quits expanding templates and uses the last most successful ctor
matched before the error. This happens only when I use mpl::vector templated
type in conjunction with templated ctor. Other types like below work fine:
template
struct my_pair :
mpl::pair, Ty_>
{
typedef my_pair my_type;
inline my_pair()
{}
explicit inline my_pair( typename const_ref::type ty)
: second_(ty)
{}
explicit inline my_pair(const my_type& other)
: second_(other.second_)
{}
inline my_type& operator =(const my_type& other)
{
second_=other.second_;
return *this;
}
second second_;
};
May be some of you have any suggestions.
Thanks a lot,
Ovanes Markarian