
For the record - I figured out my problem, which was a bit of confusion about what was an actor and how to access closure members. The "ref" passed in is a phoenix::actor, NOT the closure member itself, so to access the closure member, the operator()() of the actor needs to be invoked - substituting into the do_appender::act below: String& value(ref()); value += val; Of course, if act is called with something other than an actor, THIS will break, but I'm thinking it should ONLY be fed actors... And for my purposes, only an actor that returns a std::string&. On Jan 2, 2007, at 17:09, Hugh Hoover wrote:
I'm trying to build a parser that does a fairly simple transformation of an input string - kind of like an L-System. I can get rules to properly match the input string, but I'm having real trouble with DOING anything. For testing, I've created some simple actions and a grammar (and rules) with a closure. When I don't use the closure for "temporary" variables, I seem to be able to proceed, but when I do anything except assign a value to my closure result, I'm getting failures to compile. This is using gcc4.01 on MacOSX and spirit 1.8.3 (from boost 1.34).
The specific compiler error is: ../../src/lsystem/catalog_lsystem.cpp: In member function 'void do_appender::act(T&, const IteratorT&, const IteratorT&) const [with T = phoenix::actor<phoenix::closure_member<0, phoenix::closure<String, size_t, String> > >, IteratorT = __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]': <snip> ../../src/lsystem/catalog_lsystem.cpp:211: error: no matching function for call to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (phoenix::actor<phoenix::closure_member<0, phoenix::closure<String, size_t, String> > >&)'
From the error, it appears that I need some transformation from phoenix::actor back into my closure member, which is a String (typedef for std::basic_string<char>).
Any suggestions?
do_appender (a simple example actor) looks like:
struct do_appender { template <typename T, typename ValueT> void act(T& ref, ValueT const &val) const { ref += val; }
template <typename T, typename IteratorT> void act(T& ref, IteratorT const &first, IteratorT const & last) const { String s(first, last); ref += s; } };