まず第一に、不正確なタイトルで申し訳ありません。コンパイルエラーの原因が実際にはわからないだけです(私はspirit/phoenix/tupleが初めてです)。したがって、質問を読みやすくするために、文法全体をペーストビンにエクスポートしました: 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 =
( 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
助けてくれてありがとう、私は本当に何日もそれで立ち往生しています。