[spirit] 'nother patch, (building example5.cpp on gcc4.2), attribute_transform.hpp

Hi again guys, This one is easier. Having applied the assign_to/construct patch, examples 4 and 6 compile fine, but example5.cpp died on this: example5.cpp:283: instantiated from here ../boost/trunk/boost/spirit/home/support/attribute_transform.hpp:144: error: ambiguous class template instantiation for 'boost::spirit::traits ::strip_single_element_sequence< boost::fusion::vector< boost::variant< unsigned int, string, 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::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_ >, mpl_::bool_<false> >' ../boost/trunk/boost/spirit/home/support/attribute_transform.hpp:144: error: invalid use of incomplete type 'boost::spirit::traits ::strip_single_element_sequence< boost::fusion::vector< boost::variant< unsigned int, string, 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::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_ >, mpl_::bool_<false> >' ../boost/trunk/boost/spirit/home/support/attribute_transform.hpp:32: error: declaration of 'boost::spirit::traits::strip_single_element_sequence< boost::fusion::vector< boost::variant< unsigned int, string, 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::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_, boost::fusion::void_, boost::fusion::void_ , boost::fusion::void_ >, mpl_::bool_<false> >' You just disambiguate via enable_if to get things building. Works on gcc4.2: --- attribute_transform.hpp (revision 45915) +++ attribute_transform.hpp (working copy) @@ -11,6 +11,7 @@ #include <boost/spirit/home/support/unused.hpp> #include <boost/spirit/home/support/component.hpp> #include <boost/spirit/home/support/attribute_of.hpp> +#include <boost/spirit/home/support/detail/values.hpp> #include <boost/fusion/include/vector.hpp> #include <boost/fusion/include/is_sequence.hpp> #include <boost/variant/variant_fwd.hpp> @@ -25,16 +26,19 @@ namespace traits { + using boost::spirit::detail::not_is_variant; + // Here, we provide policies for stripping single element fusion // sequences. Add more specializations as needed. - template <typename T, typename IsSequence> + template <typename T, typename IsSequence, typename Enable = void> struct strip_single_element_sequence { typedef T type; }; template <typename T> - struct strip_single_element_sequence<fusion::vector<T>, mpl::false_> + struct strip_single_element_sequence<fusion::vector<T>, mpl::false_, + typename boost::enable_if<not_is_variant<T> >::type> { // Strips single element fusion vectors into its 'naked' // form: vector<T> --> T @@ -42,7 +46,8 @@ }; template <typename T> - struct strip_single_element_sequence<fusion::vector<T>, mpl::true_> + struct strip_single_element_sequence<fusion::vector<T>, mpl::true_, + typename boost::enable_if<not_is_variant<T> >::type> { // Strips single element fusion vectors into its 'naked' // form: vector<T> --> T, but does so only if T is not a fusion Let me know if you just want a commit, (also for the other stuff). There are a few more things like this around, I'll get after them. Thanks for a great library (these little gotchas notwithstanding). I'm getting a real kick out of all this, learning a lot... this code is *crazy*. You guys have definitely raised the bar. -t

Troy,
This one is easier. Having applied the assign_to/construct patch, examples 4 and 6 compile fine, but example5.cpp died on this:
[snipped error]
You just disambiguate via enable_if to get things building. Works on gcc4.2:
[snipped patch] I don't get this. Variant isn't a fusion sequence anymore *puzzled*.
Let me know if you just want a commit, (also for the other stuff).
Yeah please go ahead, this would be great.
There are a few more things like this around, I'll get after them.
Thanks a lot! Regards Hartmut
participants (2)
-
Hartmut Kaiser
-
troy d. straszheim