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
Ovanes Markarian writes:
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
In the context of overload resolution, any dependent type expression in a form of typename something<T, ...>::type is "non-deducible", meaning that 'T' etc. has to be explicitly specified or deduced from another argument(s), or the function template won't even be considered for forming the list of candidate functions. See 14.8.2 [temp.over] and 14.8.3 [temp.over] for more details. HTH, -- Aleksey Gurtovoy MetaCommunications Engineering
participants (2)
-
Aleksey Gurtovoy
-
Ovanes Markarian