与BOOST_FUSION_ADAPT_STRUCT调整结构时,编译器错误 [英] Compiler error when adapting struct with BOOST_FUSION_ADAPT_STRUCT

查看:201
本文介绍了与BOOST_FUSION_ADAPT_STRUCT调整结构时,编译器错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 的#include<&iostream的GT;
#包括LT&;矢量>
#包括LT&;串GT;
#包括LT&;升压/精神/有/ qi.hpp>
#包括LT&;升压/融合/有/ adapt_struct.hpp>
#包括LT&;升压/融合/有/ io.hpp>命名空间补气=的boost ::精神::补气;
结构VectorWrapper
{
    的std ::矢量<标准::字符串>数据;
};BOOST_FUSION_ADAPT_STRUCT(
    VectorWrapper,
    (性病::矢量<标准::字符串>中的数据)
)诠释的main()
{
    性病::字符串输入(AA AA AA);
    标准::字符串:迭代strbegin = input.begin();    齐::规则<的std ::字符串::迭代器,VectorWrapper(),齐::空间类型> testRule =
        +(气::字符串(AA));    VectorWrapper结果;
    布尔OK =齐:: phrase_parse(
            strbegin,
            input.end(),
            testRule,
            齐::空间,
            结果);    如果(OK功放&;&安培; strbegin == input.end()){
        性病::法院LT&;< result.data.size();
        的for(int i = 0; I< result.data.size(); ++ I){
            性病::法院LT&;< result.data [1] - ;&下; ;
        }
    }其他{
        性病::法院LT&;< 不及格<<的std :: ENDL;
        性病::法院LT&;<标准::字符串(strbegin,input.end())<<的std :: ENDL;
    }
}

我需要帮助找出在这个code问题。编译器抱怨键入 VectorWrapper 结构,但不应该 BOOST_FUSION_ADAPT_STRUCT 添加呢?

添加虚拟域(<经过href=\"http://stackoverflow.com/questions/19823413/spirit-qi-attribute-propagation-issue-with-single-member-struct\">from这个答案)我收到了同样的错误:

 结构VectorWrapper
{
    的std ::矢量&lt;标准::字符串&GT;数据;
    齐:: unused_type假;
};BOOST_FUSION_ADAPT_STRUCT(
    VectorWrapper,
    (性病::矢量&lt;标准::字符串&gt;中的数据)
    (齐:: unused_type,虚拟)

错误消息:

 在文件从/usr/local/include/boost/spirit/home/support/string_traits.hpp:16:0包括,
                 从/usr/local/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20,
                 从/usr/local/include/boost/spirit/home/support/context.hpp:18,
                 从/usr/local/include/boost/spirit/home/qi/domain.hpp:18,
                 从/usr/local/include/boost/spirit/home/qi/meta_compiler.hpp:15,
                 从/usr/local/include/boost/spirit/home/qi/action/action.hpp:14,
                 从/usr/local/include/boost/spirit/home/qi/action.hpp:14,
                 从/usr/local/include/boost/spirit/home/qi.hpp:14,
                 从/usr/local/include/boost/spirit/include/qi.hpp:16,
                 从main.cpp中:4:
/usr/local/include/boost/spirit/home/support/container.hpp:在实例化的boost ::精神特质:: :: container_value&LT; VectorWrapper,无效&GT;':
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:296:66:从'布尔的boost ::精神::齐::详细:: pass_container&LT实例; F,的Attr,序列计算值: :dispatch_attribute(const的元件与放大器;, MPL _ :: true_)常量[与组件=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt ;, F =的boost ::精神::气::详细:: fail_function&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中的Attr = VectorWrapper,序列= MPL _ :: bool_&LT;假&gt ;, MPL _ :: true_ = MPL _ :: bool_&lt;真&GT;]
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:331:61:从'布尔的boost ::精神::齐::详细:: pass_container&LT实例; F,的Attr,序列计算值: :运算符()(常量组件和放大器;)常量[与组件=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt ;, F =的boost ::精神::齐::细节:: fail_function&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中的Attr = VectorWrapper,序列= MPL _ :: bool_&LT;假&gt;]
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:63:13:从'布尔的boost ::精神::齐::加上&LT实例;主题&GT; :: parse_container(F)常量[与F = boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中VectorWrapper,MPL _ :: bool_&LT;假&gt; &gt;中主题=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt;]
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:85:13:从'布尔的boost ::精神::齐::加上&LT实例;主题&GT; ::解析(迭代器和放大器;,常量迭代器和放大器;,语境放;,常量船长和放大器;,属性与放大器;)常量[与迭代器= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中上下文=的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中船长=的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding: :标准&GT; &gt;中属性= VectorWrapper,主题=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt;]
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:43:54:从'布尔的boost ::精神::齐::详细:: parser_binder&LT实例;分析器,自动计算值: :调用(迭代器和放大器;,常量迭代器和放大器;,语境和放大器;,const的船长和放大器;, MPL _ :: false_)常量[与迭代器= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中船长=的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding: :标准&GT; &gt;中上下文=的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中解析器=的boost ::精神::齐::加&LT;的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt; &gt;中自动= MPL _ :: bool_&LT;假&gt ;, MPL _ :: false_ = MPL _ :: bool_&LT;假&gt;]
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:53:67:[跳过3实例化上下文]
/usr/local/include/boost/function/function_template.hpp:722:7:从'助推:: function4&LT实例化; R,T1,T2,T3,T4&GT; :: function4(仿函数类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型= INT]'
/usr/local/include/boost/function/function_template.hpp:1069:16:从'的boost ::功能&LT实例; R(T0,T1,T2,T3)&GT; ::功能(仿函数类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型= INT]'
/usr/local/include/boost/function/function_template.hpp:1124:5:从'typename的实例boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,提振::函数&LT; R(T0,T1,T2,T3)&GT;&安培;&GT; ::类型boost ::功能&LT; R(T0,T1,T2,T3)&GT; ::运算符=(函子)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,提振::函数&LT; R(T0,T1,T2,T3)&GT;&安培;&GT; ::类型=升压::功能&LT;布尔(__ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT;&GT;&放;,常量__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT;&GT;&放;,提振::精神::背景&LT;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&GT; ,提振::融合:: vector0&LT;&GT;&GT;&放;,常量的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT;&GT;&安培;)&GT;&安培]
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:13:从静态无效的boost ::精神::齐::规则&LT实例化;迭代器,T1,T2,T3,T4&GT ; ::定义(升压::精神::齐::规则&LT;迭代器,T1,T2,T3,T4&GT;&放;,常量Expr的&放;, MPL _ :: true_)与自动= MPL _ :: bool_&LT;假&gt ;, EXPR =的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签:: unary_plus,提振::原:: argsns _ :: list1的&LT;常量的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_$c$c<boost::spirit::tag::string,提振精神:: :: char_encoding ::标准&gt;中的boost ::融合::向量1&LT;为const char(安培)[3]&GT; &GT; &gt;中0升&GT;&安培;&gt;中1升&gt;中迭代= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中T1 = VectorWrapper(),T2 =提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&gt;中T3 =的boost ::精神:: unused_type,T4 =的boost ::精神:: unused_type,提振精神:: ::气::规则&LT;迭代器,T1,T2,T3,T4&GT; =的boost ::精神::齐::规则&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中VectorWrapper(),提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语下,提振精神::标签:: :: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&GT; &gt;中的mpl _ :: true_ = MPL _ :: bool_&lt;真]的计算值'
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:191:13:从'的boost ::精神::齐::规则&LT实例化;迭代器,T1,T2,T3,T4计算值: :规则(常量Expr的&放;,常量字符串和放大器;)与Expr的=的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签:: unary_plus,提振::原:: argsns _ :: list1的&LT ;常量的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_$c$c<boost::spirit::tag::string,提振精神:: :: char_encoding ::标准&gt;中的boost ::融合::向量1&LT;为const char(安培)[3]&GT; &GT; &gt;中0升&GT;&安培;&gt;中1升&gt;中迭代= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中T1 = VectorWrapper(),T2 =提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&gt;中T3 =的boost ::精神:: unused_type,T4 =的boost ::精神:: unused_type,标准::字符串=的std :: basic_string的&LT;烧焦&GT;]
main.cpp中:27:27:从这里实例化
/usr/local/include/boost/spirit/home/support/container.hpp:116:12:错误:没有型'结构VectorWrapper名为'VALUE_TYPE
从/usr/local/include/boost/spirit/home/qi/operator/kleene.hpp:20:0包含在文件中,
                 从/usr/local/include/boost/spirit/home/qi/directive/repeat.hpp:18,
                 从/usr/local/include/boost/spirit/home/qi/directive.hpp:23,
                 从/usr/local/include/boost/spirit/home/qi.hpp:19,
                 从/usr/local/include/boost/spirit/include/qi.hpp:16,
                 从main.cpp中:4:
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:在成员函数'布尔提振精神:: ::气::详细:: pass_container&LT; F,的Attr,序列&GT; :: dispatch_attribute( const的元件与放大器;, MPL _ :: true_)常量[与组件=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt ;, F =的boost ::精神::齐::细节:: fail_function&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中的Attr = VectorWrapper,序列= MPL _ :: bool_&所述;假&gt ;, MPL _ :: true_ = MPL _ :: bool_&lt;真]的计算值':
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:331:61:从'布尔的boost ::精神::齐::详细:: pass_container&LT实例; F,的Attr,序列计算值: :运算符()(常量组件和放大器;)常量[与组件=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt ;, F =的boost ::精神::齐::细节:: fail_function&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中的Attr = VectorWrapper,序列= MPL _ :: bool_&LT;假&gt;]
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:63:13:从'布尔的boost ::精神::齐::加上&LT实例;主题&GT; :: parse_container(F)常量[与F = boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*,性病:: basic_string的&LT;&烧焦GT; &gt;中提振精神:: ::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中提振精神:: ::气:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT ; &GT; &gt;中VectorWrapper,MPL _ :: bool_&LT;假&gt; &gt;中主题=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt;]
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:85:13:从'布尔的boost ::精神::齐::加上&LT实例;主题&GT; ::解析(迭代器和放大器;,常量迭代器和放大器;,语境放;,常量船长和放大器;,属性与放大器;)常量[与迭代器= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中上下文=的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中船长=的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding: :标准&GT; &gt;中属性= VectorWrapper,主题=的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt;]
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:43:54:从'布尔的boost ::精神::齐::详细:: parser_binder&LT实例;分析器,自动计算值: :调用(迭代器和放大器;,常量迭代器和放大器;,语境和放大器;,const的船长和放大器;, MPL _ :: false_)常量[与迭代器= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中船长=的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding: :标准&GT; &gt;中上下文=的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中解析器=的boost ::精神::齐::加&LT;的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt; &gt;中自动= MPL _ :: bool_&LT;假&gt ;, MPL _ :: false_ = MPL _ :: bool_&LT;假&gt;]
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:53:67:从'布尔的boost ::精神::齐::详细:: parser_binder&LT实例;分析器,自动计算值: :运算符()(迭代器和放大器;,常量迭代器和放大器;,语境放;,常量船长和放大器;)常量[与迭代器= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中船长=的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding: :标准&GT; &gt;中上下文=的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &gt;中解析器=的boost ::精神::齐::加&LT;的boost ::精神::齐:: literal_string&LT;为const char(安培)[3],假&gt; &gt;中自动= MPL _ :: bool_&LT;假&gt;]
/usr/local/include/boost/function/function_template.hpp:132:42:[跳过2实例化上下文]
/usr/local/include/boost/function/function_template.hpp:722:7:从'助推:: function4&LT实例化; R,T1,T2,T3,T4&GT; :: function4(仿函数类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型= INT]'
/usr/local/include/boost/function/function_template.hpp:1069:16:从'的boost ::功能&LT实例; R(T0,T1,T2,T3)&GT; ::功能(仿函数类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, INT&GT; ::类型= INT]'
/usr/local/include/boost/function/function_template.hpp:1124:5:从'typename的实例boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,提振::函数&LT; R(T0,T1,T2,T3)&GT;&安培;&GT; ::类型boost ::功能&LT; R(T0,T1,T2,T3)&GT; ::运算符=(函子)与函子= boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const炭(安培)[3],假&gt; &gt;中MPL _ :: bool_&LT;假&gt; &gt;中R =布尔,T0 = __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&安培;,T1 =常数__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &GT;&放,T2 =的boost ::精神::背景下&;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&gt;中的boost ::融合:: vector0&LT;&GT; &GT;&放大器,T3 =常数的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神::: :char_encoding ::标准与GT; &GT;&安培;,类型名boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value,提振::函数&LT; R(T0,T1,T2,T3)&GT;&安培;&GT; ::类型=升压::功能&LT;布尔(__ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT;&GT;&放;,常量__gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT;&GT;&放;,提振::精神::背景&LT;提高::融合::利弊&LT; VectorWrapper&放;,提振::融合::零&GT; ,提振::融合:: vector0&LT;&GT;&GT;&放;,常量的boost ::精神::齐:: char_class&LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT;&GT;&安培;)&GT;&安培]
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:13:从静态无效的boost ::精神::齐::规则&LT实例化;迭代器,T1,T2,T3,T4&GT ; ::定义(升压::精神::齐::规则&LT;迭代器,T1,T2,T3,T4&GT;&放;,常量Expr的&放;, MPL _ :: true_)与自动= MPL _ :: bool_&LT;假&gt ;, EXPR =的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签:: unary_plus,提振::原:: argsns _ :: list1的&LT;常量的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_$c$c<boost::spirit::tag::string,提振精神:: :: char_encoding ::标准&gt;中的boost ::融合::向量1&LT;为const char(安培)[3]&GT; &GT; &gt;中0升&GT;&安培;&gt;中1升&gt;中迭代= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中T1 = VectorWrapper(),T2 =提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&gt;中T3 =的boost ::精神:: unused_type,T4 =的boost ::精神:: unused_type,提振精神:: ::气::规则&LT;迭代器,T1,T2,T3,T4&GT; =的boost ::精神::齐::规则&LT; __ gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;&烧焦GT; &gt;中VectorWrapper(),提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语下,提振精神::标签:: :: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&GT; &gt;中的mpl _ :: true_ = MPL _ :: bool_&lt;真]的计算值'
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:191:13:从'的boost ::精神::齐::规则&LT实例化;迭代器,T1,T2,T3,T4计算值: :规则(常量Expr的&放;,常量字符串和放大器;)与Expr的=的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签:: unary_plus,提振::原:: argsns _ :: list1的&LT ;常量的boost ::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_$c$c<boost::spirit::tag::string,提振精神:: :: char_encoding ::标准&gt;中的boost ::融合::向量1&LT;为const char(安培)[3]&GT; &GT; &gt;中0升&GT;&安培;&gt;中1升&gt;中迭代= __gnu_cxx :: __ normal_iterator&LT;字符*,性病:: basic_string的&LT;焦炭&GT; &gt;中T1 = VectorWrapper(),T2 =提振::原:: exprns _ :: EXPR&LT;提高::原:: tagns _ ::标签::终端,提振::原:: argsns _ ::术语LT;的boost ::精神::标签:: char_ $ C $℃下的boost ::精神::标签::空间,提振精神:: :: char_encoding ::标准与GT; &gt;中0升&gt;中T3 =的boost ::精神:: unused_type,T4 =的boost ::精神:: unused_type,标准::字符串=的std :: basic_string的&LT;烧焦&GT;]
main.cpp中:27:27:从这里实例化
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:296:66:错误:无类型命名为'结构提升类型::精神特质:: :: container_value&LT; VectorWrapper,无效&GT ;'
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:309:15:错误:无类型命名为'结构提升类型::精神特质:: :: container_value&LT; VectorWrapper,无效&GT ;'
使:*** [全部]错误1


解决方案

您需要在您的规则发出一个未使用的类型:

 齐::规则&LT;的std ::字符串::迭代器,VectorWrapper(),齐::空间类型&GT; testRule =
    +(气::字符串(AA))&GT;&GT;齐:: ATTR(假);

#include <iostream>
#include <vector>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/fusion/include/io.hpp>

namespace qi = boost::spirit::qi;


struct VectorWrapper
{
    std::vector<std::string> data;
};

BOOST_FUSION_ADAPT_STRUCT(
    VectorWrapper,
    (std::vector<std::string>, data)
)

int main ()
{
    std::string input("aa aa aa");
    std::string::iterator strbegin = input.begin();

    qi::rule<std::string::iterator, VectorWrapper(), qi::space_type > testRule = 
        +(qi::string("aa"));

    VectorWrapper result;
    bool ok = qi::phrase_parse(
            strbegin, 
            input.end(),
            testRule,
            qi::space,                  
            result);                               

    if (ok && strbegin == input.end()) {
        std::cout << result.data.size();
        for (int i = 0; i < result.data.size(); ++i) {
            std::cout << result.data[i] << " ";
        }
    } else {
        std::cout << "fail" << std::endl;
        std::cout << std::string(strbegin, input.end()) << std::endl;
    }
}

I need help to find out problem in this code. Compiler complains about type in VectorWrapper struct but shouldn't BOOST_FUSION_ADAPT_STRUCT add it?

After adding dummy field (from this answer)I am getting the same error:

struct VectorWrapper
{
    std::vector<std::string> data;
    qi::unused_type dummy;
};

BOOST_FUSION_ADAPT_STRUCT(
    VectorWrapper,
    (std::vector<std::string>, data)
    (qi::unused_type, dummy)
)

The error message:

In file included from /usr/local/include/boost/spirit/home/support/string_traits.hpp:16:0,
                 from /usr/local/include/boost/spirit/home/support/nonterminal/expand_arg.hpp:20,
                 from /usr/local/include/boost/spirit/home/support/context.hpp:18,
                 from /usr/local/include/boost/spirit/home/qi/domain.hpp:18,
                 from /usr/local/include/boost/spirit/home/qi/meta_compiler.hpp:15,
                 from /usr/local/include/boost/spirit/home/qi/action/action.hpp:14,
                 from /usr/local/include/boost/spirit/home/qi/action.hpp:14,
                 from /usr/local/include/boost/spirit/home/qi.hpp:14,
                 from /usr/local/include/boost/spirit/include/qi.hpp:16,
                 from main.cpp:4:
/usr/local/include/boost/spirit/home/support/container.hpp: In instantiation of ‘boost::spirit::traits::container_value<VectorWrapper, void>’:
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:296:66:   instantiated from ‘bool boost::spirit::qi::detail::pass_container<F, Attr, Sequence>::dispatch_attribute(const Component&, mpl_::true_) const [with Component = boost::spirit::qi::literal_string<const char (&)[3], false>, F = boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, Attr = VectorWrapper, Sequence = mpl_::bool_<false>, mpl_::true_ = mpl_::bool_<true>]’
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:331:61:   instantiated from ‘bool boost::spirit::qi::detail::pass_container<F, Attr, Sequence>::operator()(const Component&) const [with Component = boost::spirit::qi::literal_string<const char (&)[3], false>, F = boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, Attr = VectorWrapper, Sequence = mpl_::bool_<false>]’
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:63:13:   instantiated from ‘bool boost::spirit::qi::plus<Subject>::parse_container(F) const [with F = boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, VectorWrapper, mpl_::bool_<false> >, Subject = boost::spirit::qi::literal_string<const char (&)[3], false>]’
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:85:13:   instantiated from ‘bool boost::spirit::qi::plus<Subject>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Context = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, Attribute = VectorWrapper, Subject = boost::spirit::qi::literal_string<const char (&)[3], false>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:43:54:   instantiated from ‘bool boost::spirit::qi::detail::parser_binder<Parser, Auto>::call(Iterator&, const Iterator&, Context&, const Skipper&, mpl_::false_) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, Context = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, Parser = boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, Auto = mpl_::bool_<false>, mpl_::false_ = mpl_::bool_<false>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:53:67:   [ skipping 3 instantiation contexts ]
/usr/local/include/boost/function/function_template.hpp:722:7:   instantiated from ‘boost::function4<R, T1, T2, T3, T4>::function4(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/local/include/boost/function/function_template.hpp:1069:16:   instantiated from ‘boost::function<R(T0, T1, T2, T3)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/local/include/boost/function/function_template.hpp:1124:5:   instantiated from ‘typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type boost::function<R(T0, T1, T2, T3)>::operator=(Functor) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type = boost::function<bool(__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&)>&]’
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:13:   instantiated from ‘static void boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::define(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, const Expr&, mpl_::true_) [with Auto = mpl_::bool_<false>, Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_code<boost::spirit::tag::string, boost::spirit::char_encoding::standard>, boost::fusion::vector1<const char (&)[3]> > >, 0l>&>, 1l>, Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, T1 = VectorWrapper(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, VectorWrapper(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l> >, mpl_::true_ = mpl_::bool_<true>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:191:13:   instantiated from ‘boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::rule(const Expr&, const string&) [with Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_code<boost::spirit::tag::string, boost::spirit::char_encoding::standard>, boost::fusion::vector1<const char (&)[3]> > >, 0l>&>, 1l>, Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, T1 = VectorWrapper(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, std::string = std::basic_string<char>]’
main.cpp:27:27:   instantiated from here
/usr/local/include/boost/spirit/home/support/container.hpp:116:12: error: no type named ‘value_type’ in ‘struct VectorWrapper’
In file included from /usr/local/include/boost/spirit/home/qi/operator/kleene.hpp:20:0,
                 from /usr/local/include/boost/spirit/home/qi/directive/repeat.hpp:18,
                 from /usr/local/include/boost/spirit/home/qi/directive.hpp:23,
                 from /usr/local/include/boost/spirit/home/qi.hpp:19,
                 from /usr/local/include/boost/spirit/include/qi.hpp:16,
                 from main.cpp:4:
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp: In member function ‘bool boost::spirit::qi::detail::pass_container<F, Attr, Sequence>::dispatch_attribute(const Component&, mpl_::true_) const [with Component = boost::spirit::qi::literal_string<const char (&)[3], false>, F = boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, Attr = VectorWrapper, Sequence = mpl_::bool_<false>, mpl_::true_ = mpl_::bool_<true>]’:
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:331:61:   instantiated from ‘bool boost::spirit::qi::detail::pass_container<F, Attr, Sequence>::operator()(const Component&) const [with Component = boost::spirit::qi::literal_string<const char (&)[3], false>, F = boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, Attr = VectorWrapper, Sequence = mpl_::bool_<false>]’
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:63:13:   instantiated from ‘bool boost::spirit::qi::plus<Subject>::parse_container(F) const [with F = boost::spirit::qi::detail::pass_container<boost::spirit::qi::detail::fail_function<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> > >, VectorWrapper, mpl_::bool_<false> >, Subject = boost::spirit::qi::literal_string<const char (&)[3], false>]’
/usr/local/include/boost/spirit/home/qi/operator/plus.hpp:85:13:   instantiated from ‘bool boost::spirit::qi::plus<Subject>::parse(Iterator&, const Iterator&, Context&, const Skipper&, Attribute&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Context = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, Attribute = VectorWrapper, Subject = boost::spirit::qi::literal_string<const char (&)[3], false>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:43:54:   instantiated from ‘bool boost::spirit::qi::detail::parser_binder<Parser, Auto>::call(Iterator&, const Iterator&, Context&, const Skipper&, mpl_::false_) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, Context = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, Parser = boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, Auto = mpl_::bool_<false>, mpl_::false_ = mpl_::bool_<false>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/detail/parser_binder.hpp:53:67:   instantiated from ‘bool boost::spirit::qi::detail::parser_binder<Parser, Auto>::operator()(Iterator&, const Iterator&, Context&, const Skipper&) const [with Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, Context = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >, Parser = boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, Auto = mpl_::bool_<false>]’
/usr/local/include/boost/function/function_template.hpp:132:42:   [ skipping 2 instantiation contexts ]
/usr/local/include/boost/function/function_template.hpp:722:7:   instantiated from ‘boost::function4<R, T1, T2, T3, T4>::function4(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/local/include/boost/function/function_template.hpp:1069:16:   instantiated from ‘boost::function<R(T0, T1, T2, T3)>::function(Functor, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, int>::type = int]’
/usr/local/include/boost/function/function_template.hpp:1124:5:   instantiated from ‘typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type boost::function<R(T0, T1, T2, T3)>::operator=(Functor) [with Functor = boost::spirit::qi::detail::parser_binder<boost::spirit::qi::plus<boost::spirit::qi::literal_string<const char (&)[3], false> >, mpl_::bool_<false> >, R = bool, T0 = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T1 = const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, T2 = boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, T3 = const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&, typename boost::enable_if_c<boost::type_traits::ice_not<boost::is_integral<Functor>::value>::value, boost::function<R(T0, T1, T2, T3)>&>::type = boost::function<bool(__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, const __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >&, boost::spirit::context<boost::fusion::cons<VectorWrapper&, boost::fusion::nil>, boost::fusion::vector0<> >&, const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >&)>&]’
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:182:13:   instantiated from ‘static void boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::define(boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>&, const Expr&, mpl_::true_) [with Auto = mpl_::bool_<false>, Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_code<boost::spirit::tag::string, boost::spirit::char_encoding::standard>, boost::fusion::vector1<const char (&)[3]> > >, 0l>&>, 1l>, Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, T1 = VectorWrapper(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, boost::spirit::qi::rule<Iterator, T1, T2, T3, T4> = boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, VectorWrapper(), boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l> >, mpl_::true_ = mpl_::bool_<true>]’
/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:191:13:   instantiated from ‘boost::spirit::qi::rule<Iterator, T1, T2, T3, T4>::rule(const Expr&, const string&) [with Expr = boost::proto::exprns_::expr<boost::proto::tagns_::tag::unary_plus, boost::proto::argsns_::list1<const boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::terminal_ex<boost::spirit::tag::char_code<boost::spirit::tag::string, boost::spirit::char_encoding::standard>, boost::fusion::vector1<const char (&)[3]> > >, 0l>&>, 1l>, Iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >, T1 = VectorWrapper(), T2 = boost::proto::exprns_::expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::standard> >, 0l>, T3 = boost::spirit::unused_type, T4 = boost::spirit::unused_type, std::string = std::basic_string<char>]’
main.cpp:27:27:   instantiated from here
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:296:66: error: no type named ‘type’ in ‘struct boost::spirit::traits::container_value<VectorWrapper, void>’
/usr/local/include/boost/spirit/home/qi/detail/pass_container.hpp:309:15: error: no type named ‘type’ in ‘struct boost::spirit::traits::container_value<VectorWrapper, void>’
make: *** [all] Error 1

解决方案

You need to emit an unused type in your rule:

qi::rule<std::string::iterator, VectorWrapper(), qi::space_type > testRule = 
    +(qi::string("aa")) >> qi::attr(false);

这篇关于与BOOST_FUSION_ADAPT_STRUCT调整结构时,编译器错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆