首先,很抱歉标题不准确,只是我实际上并不知道是什么导致了编译错误(我是 Spirit/phoenix/tuple 的新手),因此为了我的问题的可读性,我将整个语法导出到 pastebin: http ://pastebin.com/RsGM8E4r
代码在 Visual Studio 2010 中编译:
Iterator = std::string::const_iterator
以及您在底部了解语法和我的问题所需的其他信息:
namespace parser { namespace container1 {
template < typename _C >
class atom : public element < _C >
{
private:
typedef typename std::basic_string < _C > _string;
public:
explicit atom ( const boost::variant < bool, long, double, _string > & value )
: _value ( value )
{
_element_type = TY_ATOM;
}
explicit atom ()
{
}
template < typename T >
const T as () const
{
return boost::apply_visitor ( atom_visitor < _C, T > (), _value );
}
private:
boost::variant < bool, long, double, _string > _value;
};
template < typename _C >
struct item
{
typedef typename element < _C > type;
typedef typename boost::shared_ptr < type > ptr;
};
}}
group 和 list 也有元素作为基础。
现在,我不明白的是,当您查看语法时, atom 的规则定义是:
atom =
( qi::double_ | qi::long_ | qi::bool_ | string ) [ qi::_val = phoenix::construct < _item_ptr > ( phoenix::new_ < _atom > ( qi::_1 ) ) ]
;
这给出了一个很长的编译器错误列表,我无法真正理解..再次导出到 pastebin:http: //pastebin.com/k4HseJ01
但是,如果我将规则更改为
atom =
( qi::double_ | qi::long_ | qi::bool_ | string ) [ qi::_val = phoenix::construct < _item_ptr > ( phoenix::new_ < _atom > () ) ]
;
它编译成功,但是我需要从该规则中获取解析的数据:P
非常感谢您的帮助,我真的坚持了好几天。