2

まず第一に、不正確なタイトルで申し訳ありません。コンパイルエラーの原因が実際にはわからないだけです(私は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

助けてくれてありがとう、私は本当に何日もそれで立ち往生しています。

4

0 に答える 0