我已经查看了此网页http://www.boost.org/doc/libs/1_44_0/libs/spirit/doc/html/spirit/qi/quick_reference/compound_attribute_rules.html以及其他许多网页,但无法找到我的问题的答案。
我有一个C%= A%B形式的规则,其中B是解析器而不是文字,它的类型与A不同。上面网页上给出的规则说:
a: A, b: B --> (a % b): vector<A>
但鉴于在我的情况下,B是一个解析器,而不是A类,这个规则似乎没有做到这一点。
我试过了这个:
(a % b): variant<A, tuple<B,A>>
因此定义了这种结构:
struct equality_expression
{
variant<A,tuple<B,A>> equexp;
};
之后
BOOST_FUSION_ADAPT_STRUCT(
equality_expression,
(variant<A,tuple<B,A>>, equexp);
)
但是编译器抱怨:
warning C4002: too many actual parameters for macro 'BOOST_FUSION_ADAPT_STRUCT_FILLER_0'
那么,这样做的正确方法是什么?
答案 0 :(得分:2)
阅读a: A, b: B --> (a % b): vector<A>
的方法是:“如果解析器a
公开属性A
,则解析器b
公开属性B
,然后{{1}公开属性a%b
“,这意味着在列表解析器中始终忽略B的属性。宏调用的问题是the commas that separate the template parameters。