|
Boost Users : |
From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2006-06-25 17:22:01
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_at_[hidden]]
Sent: Sunday, June 25, 2006 23:18
To: 'boost-users_at_[hidden]'
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<Seq_> 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<Seq_>::discriminated_union(const
discriminated_union<Seq_> &)' : cannot convert parameter 1 from 't1' to
'const discriminated_union<Seq_> &'
with
[
Seq_=types_vector
]
Reason: cannot convert from 't1' to 'const
discriminated_union<Seq_>'
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<int D_, class Ty_>
struct my_pair :
mpl::pair<mpl::int_<D_>, Ty_>
{
typedef my_pair<D_, Ty_> my_type;
inline my_pair()
{}
explicit inline my_pair( typename const_ref<Ty_>::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
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