
---------------------------------------------------------------------------------- struct extract_rule {
template <typename Sig> struct result;
template <typename Holder> struct result< extract_rule(const Holder) > { typedef const typename Holder::type& type; };
template <typename Holder> typename result< extract_rule(const Holder) >::type operator()( const Holder& h ) const { return h.rule; } }; ----------------------------------------------------------------------------------
1> with 1> [ 1> Sig=extract_rule (const onevariantrule<parameters_t,0,boost::spirit::istream_iterator> ) 1> ]
The template onevariantrule<> is defined _before_ extract_rule.
------------------------------------------------------------------------------------------- template <typename parameters_t, unsigned n, typename Iterator> struct onevariantrule { typedef .... type; }; -------------------------------------------------------------------------------------------
Holder matches onevariantrule<parameters_t,0,boost::spirit::istream_iterator>. That template instantiation is indeed a class.
Both specializations template <typename Holder> struct result< extract_rule(const Holder) > { }; and template <typename Holder> struct result< extract_rule(const Holder& ) > { ///// the reference was missing here, doh! typedef const typename Holder::type& type; }; were needed. Sorry for the spam,