
-----Original Message-----
From: "Hicham Mouline" [hicham@mouline.org] Date: 26/02/2010 09:40 AM To: boost-users@lists.boost.org Subject: Re: result_of protocol.
---------------------------------------------------------------------------------- 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.
In the snippet above, I replaced Holder by what the compiler tells me it is in the error log, as ------------------------------------------------------------ struct extract_rule { template <typename Sig> struct result; template <typename Holder> struct result< extract_rule(const Holder) > { typedef const onevariantrule<parameters_t,0,boost::spirit::istream_iterator>::type& type; }; ------------------------------------------------------------ And this works. If msvc is able to see that Holder is that particular template instantiation in the error log, isn't it able to know then that Holder is a class? regards,