1

在我的一条规则中,将 qi::locals<> 与 stl 容器作为参数。当我在没有 BOOST_SPIRIT_QI_DEBUG 的情况下编译我的程序时,一切正常。但是当我打开 BOOST_SPIRIT_QI_DEBUG 时,由于缺少运算符 <<,程序无法编译。

简化片段:

typedef std::list< int > TlstValues;

template <typename Iterator, typename Skipper>
struct G_test : qi::grammar<Iterator, Skipper>
{
  ...
  G_test() : G_test::base_type(rule_test)
  {
    ...
    BOOST_SPIRIT_DEBUG_NODE(rule_test);
  }

  qi::rule<Iterator, qi::locals<TlstValues>, Skipper> rule_test;
}

错误:

error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'TlstExpressionItems' (or there is no acceptable conversion)

我试图为 TlstValues 定义流式操作符,但没有效果。错误还是一样。我的运营商定义:

std::ostream& operator << (std::ostream& os, TlstValues & z)
{
return os;
} 

有人可以告诉我如何定义所需的运算符以使 BOOST_SPIRIT_DEBUG 工作吗?

谢谢和问候瑞克

4

1 回答 1

2

强制 ADL 找到您的流操作符的最简单方法是将其放入命名空间 std:

namespace std
{
    std::ostream& operator<< (std::ostream& os, TlstValues& z)
    {
        // do your stuff here
        return os;
    } 
}

是的,我知道,这是正式不允许的。但是,从务实的角度来看,这仍然是最简单的方法。

print_attribute_debug符合标准的解决方案是为您的属性类型专门化 Spirit 自定义点:

// your specialization needs to be in namespace boost::spirit::traits
namespace boost { namespace spirit { namespace traits
{
    template <typename Out>
    struct print_attribute_debug<Out, TlstValues>
    {
        static void call(Out& out, TlstValues const& val)
        {
            // do your output here; Out is a std::ostream
        }
    };
}}}
于 2011-03-13T01:37:01.827 回答