Opened 11 years ago

Closed 6 years ago

#6268 closed Bugs (fixed)

Conflict between fusion and phoenix operator<

Reported by: Nathan Ridge <zeratul976@…> Owned by: Thomas Heller
Milestone: To Be Determined Component: phoenix
Version: Boost Development Trunk Severity: Problem
Keywords: Cc:

Description

When using the sequence_facade extension mechanism to adapt my own Fusion sequences, I experience a conflict between fusion and phoenix's operator<. The problem is that in a lambda expression like "arg1 < s" where "s" is a Fusion sequence defined using sequence_facade, Fusion tries to instantiate its operator<, but the instantiation gives an error because "arg1" is not a Fusion sequence and does not have "size" etc. Here is a minimal sample that reproduces the problem: #include <boost/fusion/sequence/comparison.hpp> #include <boost/fusion/sequence/sequence_facade.hpp> #include <boost/phoenix/core.hpp> #include <boost/phoenix/operator/comparison.hpp> struct foo : boost::fusion::sequence_facade<foo, boost::fusion::random_access_traversal_tag> {

Rest of the sequence_facade extension mechanism code omitted, as it is not needed to reproduce the error

foo() : x(), y() {}

int x; int y;

}; int main() {

auto x = boost::phoenix::arg_names::arg1 < foo();

}

Here are the errors:

In file included from

boost/boost/fusion/view/joint_view/joint_view.hpp:15:0,

from boost/boost/fusion/algorithm/transformation/push_back.hpp:11, from

boost/boost/fusion/view/iterator_range/detail/segmented_iterator_ range.hpp:19,a

from boost/boost/fusion/view/iterator_range/detail/segments_impl.hpp

:13,

from boost/boost/fusion/view/iterator_range/iterator_range.hpp:21, from boost/boost/fusion/view/iterator_range.hpp:10, from boost/boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp

:12,

from boost/boost/fusion/sequence/intrinsic/begin.hpp:17, from boost/boost/fusion/sequence/comparison/equal_to.hpp:11, from boost/boost/fusion/sequence/comparison.hpp:10, from test.cpp:1: boost/boost/fusion/sequence/intrinsic/size.hpp: In instantiation of

'boost::fusion::extension::size_impl<boost::proto::tagns_::tag::proto_expr> ::unsegmented_size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

':

boost/boost/fusion/sequence/intrinsic/size.hpp:36:20: required from

'boost::fusion::extension::size_impl<boost::proto::tagns_::tag::proto_expr> ::apply<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

'

boost/boost/fusion/sequence/intrinsic/size.hpp:68:16: required from

'boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

'

boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:60:29: required

from 'boost::mpl::equal_to_tag<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

'

boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:67:8: required

from 'boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/nested_type_wknd.hpp:26:31: required from

'boost::mpl::aux::nested_type_wknd<

boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:23:8: required from

'boost::mpl::aux::and_impl<

true

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8: required from

'boost::mpl::and_<

boost::mpl::or_<

boost::fusion::traits::is_sequence<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::traits::is_sequence<foo>, mpl_::bool_<false>

, mpl_::bool_<false>, mpl_::bool_<false>

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/fusion/sequence/comparison/enable_comparison.hpp:26:12:

required from 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

boost/boost/utility/enable_if.hpp:36:10: required from 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool '

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/fusion/sequence/intrinsic/size.hpp:33:20: error: no type

named 'size' in 'boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

'

boost/boost/fusion/sequence/intrinsic/size.hpp: In instantiation of

'boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

':

boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:60:29: required

from 'boost::mpl::equal_to_tag<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

'

boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:67:8: required

from 'boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/nested_type_wknd.hpp:26:31: required from

'boost::mpl::aux::nested_type_wknd<

boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:23:8: required from

'boost::mpl::aux::and_impl<

true

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8: required from

'boost::mpl::and_<

boost::mpl::or_<

boost::fusion::traits::is_sequence<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::traits::is_sequence<foo>, mpl_::bool_<false>

, mpl_::bool_<false>, mpl_::bool_<false>

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/fusion/sequence/comparison/enable_comparison.hpp:26:12:

required from 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

boost/boost/utility/enable_if.hpp:36:10: required from 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool '

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/fusion/sequence/intrinsic/size.hpp:74:44: error: no type

named 'type' in 'boost::fusion::extension::size_impl<

boost::proto::tagns_::tag::proto_expr

::apply<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

'

In file included from boost/boost/mpl/aux_/include_preprocessed.hpp

:37:0,

from boost/boost/mpl/aux_/comparison_op.hpp:35, from boost/boost/mpl/equal_to.hpp:19, from boost/boost/fusion/container/list/detail/equal_to_impl.hpp:11, from boost/boost/fusion/container/list/cons_iterator.hpp:16, from boost/boost/fusion/container/list/cons.hpp:17, from boost/boost/fusion/iterator/segmented_iterator.hpp:13, from boost/boost/fusion/sequence/intrinsic/detail/segmented_begin.hpp

:11,

from boost/boost/fusion/sequence/intrinsic/begin.hpp:17, from boost/boost/fusion/sequence/comparison/equal_to.hpp:11, from boost/boost/fusion/sequence/comparison.hpp:10, from test.cpp:1: boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp: In instantiation

of 'boost::mpl::equal_to_tag<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

':

boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:67:8: required

from 'boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/nested_type_wknd.hpp:26:31: required from

'boost::mpl::aux::nested_type_wknd<

boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:23:8: required from

'boost::mpl::aux::and_impl<

true

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8: required from

'boost::mpl::and_<

boost::mpl::or_<

boost::fusion::traits::is_sequence<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::traits::is_sequence<foo>, mpl_::bool_<false>

, mpl_::bool_<false>, mpl_::bool_<false>

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/fusion/sequence/comparison/enable_comparison.hpp:26:12:

required from 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

boost/boost/utility/enable_if.hpp:36:10: required from 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool '

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp:60:29: error: no

type named 'tag' in 'boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

'

In file included from boost/boost/mpl/not.hpp:19:0, from boost/boost/mpl/is_sequence.hpp:17, from boost/boost/fusion/support/detail/is_mpl_sequence.hpp:12, from boost/boost/fusion/support/tag_of.hpp:13, from boost/boost/fusion/support/is_sequence.hpp:11, from boost/boost/fusion/sequence/intrinsic_fwd.hpp:12, from boost/boost/fusion/sequence/intrinsic/begin.hpp:13, from boost/boost/fusion/sequence/comparison/equal_to.hpp:11, from boost/boost/fusion/sequence/comparison.hpp:10, from test.cpp:1: boost/boost/mpl/aux_/nested_type_wknd.hpp: In instantiation of 'boost

::mpl::aux::nested_type_wknd<

boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> ':

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:23:8: required from

'boost::mpl::aux::and_impl<

true

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8: required from

'boost::mpl::and_<

boost::mpl::or_<

boost::fusion::traits::is_sequence<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::traits::is_sequence<foo>, mpl_::bool_<false>

, mpl_::bool_<false>, mpl_::bool_<false>

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/fusion/sequence/comparison/enable_comparison.hpp:26:12:

required from 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

boost/boost/utility/enable_if.hpp:36:10: required from 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool '

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/mpl/aux_/nested_type_wknd.hpp:26:31: error: no type named

'type' in 'boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, boost::fusion::result_of::size<foo> '

In file included from boost/boost/mpl/aux_/include_preprocessed.hpp

:37:0,

from boost/boost/mpl/and.hpp:42, from boost/boost/mpl/is_sequence.hpp:18, from boost/boost/fusion/support/detail/is_mpl_sequence.hpp:12, from boost/boost/fusion/support/tag_of.hpp:13, from boost/boost/fusion/support/is_sequence.hpp:11, from boost/boost/fusion/sequence/intrinsic_fwd.hpp:12, from boost/boost/fusion/sequence/intrinsic/begin.hpp:13, from boost/boost/fusion/sequence/comparison/equal_to.hpp:11, from boost/boost/fusion/sequence/comparison.hpp:10, from test.cpp:1: boost/boost/mpl/aux_/preprocessed/gcc/and.hpp: In instantiation of

'boost::mpl::aux::and_impl<

true

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> ':

boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8: required from

'boost::mpl::and_<

boost::mpl::or_<

boost::fusion::traits::is_sequence<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::traits::is_sequence<foo>, mpl_::bool_<false>

, mpl_::bool_<false>, mpl_::bool_<false>

, boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> , mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> '

boost/boost/fusion/sequence/comparison/enable_comparison.hpp:26:12:

required from 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

boost/boost/utility/enable_if.hpp:36:10: required from 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool '

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/mpl/aux_/preprocessed/gcc/and.hpp:23:8: error: 'value' is

not a member of 'boost::mpl::aux::nested_type_wknd<

boost::mpl::equal_to<

boost::fusion::result_of::size<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<

boost::phoenix::argument<1>

, 0l , boost::fusion::result_of::size<foo> '

In file included from boost/boost/fusion/sequence/intrinsic/begin.hpp

:11:0,

from boost/boost/fusion/sequence/comparison/equal_to.hpp:11, from boost/boost/fusion/sequence/comparison.hpp:10, from test.cpp:1: boost/boost/utility/enable_if.hpp: In instantiation of 'boost

::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

, foo, void , bool ':

boost/boost/fusion/sequence/comparison/less.hpp:35:9: required by

substitution of 'template<

class boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo, class Seq2

boost::enable_if<

boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> > , 0l

; Seq2 = foo, Seq2 , bool ::type boost::fusion::operators::operator<(

const boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

; Seq2 = foo &, const Seq2 &

)'

test.cpp:19:52: required from here boost/boost/utility/enable_if.hpp:36:10: error: 'value' is not a

member of 'boost::fusion::traits::enable_comparison<

boost::phoenix::actor<

boost::proto::exprns_::basic_expr<

boost::proto::tagns_::tag::terminal

, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l

, foo, void '

Change History (4)

comment:1 by Nathan Ridge <zeratul976@…>, 11 years ago

Sorry, that didn't come out well and I don't know how to edit the description :(

Here is the code that causes the error, in code tags this time:

#include <boost/fusion/sequence/comparison.hpp>
#include <boost/fusion/sequence/sequence_facade.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator/comparison.hpp>
 
struct foo : boost::fusion::sequence_facade<foo, boost::fusion::random_access_traversal_tag>
{
    // Rest of the sequence_facade extension mechanism code omitted,
    // as it is not needed to reproduce the error
 
    foo() : x(), y() {}
    
    int x;
    int y;
};
 
int main()
{
    auto x = boost::phoenix::arg_names::arg1 < foo();
}

comment:2 by Nathan Ridge <zeratul976@…>, 11 years ago

The error can be fixed by adding the following include:

#include <boost/proto/fusion.hpp>

comment:3 by John Fletcher <J.P.Fletcher@…>, 9 years ago

Fix and test posted to boost phoenix develop

comment:4 by Kohei Takahashi, 6 years ago

Resolution: fixed
Status: newclosed

Compiler picks correct overload now. http://melpon.org/wandbox/permlink/1M41RhgXNvI003Sd

Note: See TracTickets for help on using tickets.