2

解決策が表示されないというエラーが表示されます。まず、関連するコード:

namespace C {

    struct RangeEntry {
        size_t byte;
        boost::optional<size_t> bit;
    };

    struct Range {
        RangeEntry firstPart;
        boost::optional<RangeEntry> secondPart;
        boost::optional<size_t> shift;
    };
}

BOOST_FUSION_ADAPT_STRUCT(
    C::RangeEntry,
    (size_t, byte)
    (boost::optional<size_t>, bit)
)

BOOST_FUSION_ADAPT_STRUCT(
    C::Range,
    (C::RangeEntry , firstPart)
    (boost::optional<C::RangeEntry> , secondPart)
    (boost::optional<size_t> , shift)
)

... Declare the rules ...

karma::rule<Iterator, C::Range()> range;
karma::rule<Iterator, C::RangeEntry()> range_part;

... Define rules ...

range_part %= no_delimit[ulong_ << -(lit(":") << ulong_)];
range %= no_delimit[range_part << -(lit("-") << range_part)] << -(lit("<<") << ulong_);

そのrange %=部分で、コンパイルエラーが発生します

/usr/include/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp:504:30: error:
invalid operands to binary expression 
('C::RangeEntry' and 'C::RangeEntry')
    return floor(num / spirit::traits::pow10<T>(exp));
                 ~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

RangeEntry を ulong_ ルールに一致させようとしていると推測していますが、その理由がわかりません。私は何が欠けていますか?

4

1 に答える 1

5

no_delimitディレクティブは、公開された融合シーケンスを再グループ化します。以下はコンパイルされることに注意してください。

    range %= range_part << -(lit("-") << range_part) << -(lit("<<") << ulong_);

あるいは

    range %= no_delimit[range_part << -(lit("-") << range_part) << -(lit("<<") << ulong_)];

AFAICTルールは区切り文字なしで定義されているため、no_delimitはここでは冗長にする必要があります。


自己完結型のサンプルにするために、RangeEntryタイプを「空想」しました。

#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/karma.hpp>

namespace karma = boost::spirit::karma;

namespace C {
    typedef std::pair<unsigned long, boost::optional<unsigned long> > RangeEntry;

    struct Range {
        RangeEntry firstPart;
        boost::optional<RangeEntry> secondPart;
        boost::optional<size_t> shift;
    };
}

BOOST_FUSION_ADAPT_STRUCT(
    C::Range,
    (C::RangeEntry , firstPart)
    (boost::optional<C::RangeEntry> , secondPart)
    (boost::optional<size_t> , shift)
    );

//... Declare the rules ...

int main()
{
    typedef char* Iterator;
    karma::rule<Iterator, C::Range()> range;
    karma::rule<Iterator, C::RangeEntry()> range_part;

    //... Define rules ...

    using namespace karma;
    range_part %= no_delimit[ulong_ << -(lit(":") << ulong_)];
    range %= no_delimit[range_part << -(lit("-") << range_part) << -(lit("<<") << ulong_)];
}
于 2013-03-16T17:07:39.523 に答える