Opened 10 years ago

Closed 10 years ago

#2246 closed Bugs (fixed)

Phoenix2 lazy function compilation error

Reported by: François Barel <frabar666@…> Owned by: Joel de Guzman
Milestone: Boost 1.37.0 Component: spirit
Version: Boost 1.36.0 Severity: Problem
Keywords: phoenix lazy function Cc:


I get a compilation error when trying to do a lazy Phoenix function.

By that I mean a Phoenix function (for use in a Spirit action) which is in fact the result of calling another Phoenix actor (in my case a phoenix::bind) -- as the implementation of function, compose and function_eval seems to allow (IIUC the function can be any Phoenix actor, just like its arguments).


#include <boost/spirit/include/qi.hpp>
using namespace ::boost::spirit;
using namespace ::boost::spirit::qi;

#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/phoenix_function.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
using namespace ::boost::phoenix;

template< typename F >
function< F > make_function(const F& f)
    { return function< F >(f); }

struct Actor
    typedef void result_type;
    template< typename T = unused_type >
    struct result { typedef result_type type; };
    void operator()(int) const { assert( this != NULL ); }

struct Context
    const Actor* pa;

int main()
    Context c = { NULL };
    Actor a;

    rule< const wchar_t* > r;
    // Not lazy, fine.
    r = eps[ make_function( a                        )(42) ];
    // Lazy, compilation error.
    r = eps[ make_function( *bind( &Context::pa, c ) )(42) ]; = &a;

    const wchar_t* x = L"";
    parse(x, x, r);

    return 0;

The error is (note the '&'):

  error: ‘const Actor&’ is not a class, struct, or union type

The attached patch (remove_reference when getting function type) solved it for me.


Attachments (1)

Phoenix2_lazy.diff (1008 bytes) - added by François Barel <frabar666@…> 10 years ago.

Download all attachments as: .zip

Change History (2)

Changed 10 years ago by François Barel <frabar666@…>

Attachment: Phoenix2_lazy.diff added

comment:1 Changed 10 years ago by Joel de Guzman

Resolution: fixed
Status: newclosed
Note: See TracTickets for help on using tickets.