
In confix_parser_gen: Adding another level of indirection solves the problem: template<typename StartT, typename ExprT, typename EndT> confix_parser< typename as_parser<StartT>::type, <- VC7.1 ICEs on these typename as_parser<ExprT>::type, typename as_parser<EndT>::type, typename as_parser<ExprT>::type::parser_category_t, NestedT, LexemeT > operator()( StartT const &start_, ExprT const &expr_, EndT const &end_) const Filtering the confix_parser into type-generating template, result_type, solves this ICE. template<typename StartT, typename ExprT, typename EndT> struct result_type { typedef confix_parser< typename as_parser<StartT>::type, typename as_parser<ExprT>::type, typename as_parser<EndT>::type, typename as_parser<ExprT>::type::parser_category_t, NestedT, LexemeT > type; }; template<typename StartT, typename ExprT, typename EndT> typename result_type<StartT,ExprT,EndT>::type operator()( StartT const &start_, ExprT const &expr_, EndT const &end_) const Now rule_parser_1_1 passes without problems. Attached is a patch with this fix. Regards, Peder