Hello, here my compile problem using phoenix (for use with spirit): ---8<--- template<typename ActionsT> struct tag_keyword_action { template <typename ScanT, typename Iter1T, typename Iter2T> struct result { typedef void type; }; explicit tag_keyword_action( const ActionsT& action ) : action( action ) { } template <typename ScanT, typename Iter1T, typename Iter2T> void operator()( const ScanT& scan, const Iter1T& bgn, const Iter2T& end ) const { action.on_tag( // the real action / assign class std::string( bgn, end ), scan.first.get_position().line ); } const ActionsT& action; }; template<typename ActionsT> struct ver_parser { typedef ::phoenix::function< tag_keyword_action<ActionsT> > keyword_tag_type; explicit ver_parser( const ActionsT& action ) : tag_keyword( action ) { } template <typename ScannerT> std::ptrdiff_t operator()(const ScannerT& scan, result_t& result) const { ... rule_t rule = lexeme_d[ ... ][tag_keyword( var( scan ), arg1, arg2 )] ... } const keyword_tag_type tag_keyword; }; template <typename ActionsT = parse_actions, typename ErrorHandlerT = parse_error_handler> struct grammar : sp::grammar< grammar<ActionsT, ErrorHandlerT> > { explicit grammar(const ActionsT& actions = ActionsT(), const ErrorHandlerT& handler = ErrorHandlerT()) : actions( actions ), error_handler( handler ) { } template <typename ScannerT> struct definition { ... explicit definition( const grammar& self ) : ver_p( self.actions ) { ... } ... const sp::functor_parser< ver_parser<ActionsT> > ver_p; }; ... }; --->8--- The (beautified) error message is: error: no matching function for call to 'boost::spirit::functor_parser<ver_parser<parse_actions>
::functor_parser(const parse_actions&)'
candidates are: boost::spirit::functor_parser<FunctorT>::functor_parser(const FunctorT&) [with FunctorT = ver_parser<parse_actions>] boost::spirit::functor_parser<FunctorT>::functor_parser() [with FunctorT = ver_parser<parse_actions>] boost::spirit::functor_parser<ver_parser<parse_actions>
::functor_parser(const boost::spirit::functor_parser<ver_parser<parse_actions> >&)
What is the correct syntax, is this way a good choice? I want to tag the keyword in the given data files with their lines to display them in a browser later. Thanks, Olaf
Hi, more details ;-) The error message is: .../grammar.hpp:51: error: No match for 'boost::spirit ::functor_parser< data_ver_parser<parse_actions> >::functor_parser(const parse_actions &)' /usr/include/boost/spirit/utility/functor_parser.hpp:34: candidates are: boost ::spirit::functor_parser< data_ver_parser<parse_actions> > ::functor_parser( const data_ver_parser< parse_actions> &) /usr/include/boost/spirit/utility/functor_parser.hpp:33: boost::spirit ::functor_parser< data_ver_parser<parse_actions> > ::functor_parser() /usr/include/boost/spirit/utility/functor_parser.hpp:30: boost::spirit ::functor_parser< data_ver_parser<parse_actions> > ::functor_parser( const boost::spirit::functor_parser< data_ver_parser<eda::data::detail ::parse_actions> > &) It seems, that the spirit functor parser can't get other template arguments expect its own/template type (copy ctor etc.) Well, more to the background: I want to write a tagging support for associating keywords to lines. To separate I have several functor parser which recognizes the keywords and should tag them. I have to store the tagged data somewhere - not in global space (not thread-safe). Is there a way? What could be one? Thanks, Olaf
participants (1)
-
Olaf Peter