C++ 使用Boost.Spirit.Qi解析为向量

C++ 使用Boost.Spirit.Qi解析为向量,c++,parsing,boost,boost-spirit-qi,C++,Parsing,Boost,Boost Spirit Qi,我对精神很陌生。 我正在尝试使用Qi在我的嵌入式Tcl解释器中解析CMD命令的参数。 由于某些参数可能会被多次使用,因此我需要一个向量来存储相同类型的所有参数 这是我问题的一个简化示例,我尝试将整数存储到向量中 #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> #include <boost/spirit/include/phoenix_core.hp

我对精神很陌生。 我正在尝试使用Qi在我的嵌入式Tcl解释器中解析CMD命令的参数。 由于某些参数可能会被多次使用,因此我需要一个向量来存储相同类型的所有参数

这是我问题的一个简化示例,我尝试将整数存储到向量中

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/support.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/variant/recursive_variant.hpp>

using std::string;
using std::vector;

namespace {
  namespace qi = boost::spirit::qi;
  namespace phoenix = boost::phoenix;
  namespace ascii = boost::spirit::ascii;

  struct Argument {
    vector<int> svDefine;    // macro definitions
  };
}

BOOST_FUSION_ADAPT_STRUCT
(
 Argument,
 (vector<int>, svDefine)
 )

namespace {
  typedef string::const_iterator SIter;

  struct ArgParser : qi::grammar<SIter, Argument(), ascii::space_type> {
    qi::rule<SIter, Argument(), ascii::space_type> start;

    ArgParser() : ArgParser::base_type(start) {
      using phoenix::at_c;
      using qi::int_;
      using phoenix::push_back;
      using namespace qi::labels;


      start = +("define" >> int_     [push_back(at_c<0>(_val), _1)]);

    }
  };
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用std::string;
使用std::vector;
名称空间{
名称空间qi=boost::spirit::qi;
名称空间phoenix=boost::phoenix;
名称空间ascii=boost::spirit::ascii;
结构参数{
向量svDefine;//宏定义
};
}
增强融合适应结构
(
论点
(向量,svDefine)
)
名称空间{
typedef字符串::const_迭代器SIter;
结构ArgParser:qi::grammar{
qi::规则开始;
ArgParser():ArgParser::基本类型(开始){
使用phoenix::at_c;
使用qi::int_;
使用phoenix::推回;
使用名称空间qi::标签;
start=+(“define”>>int[push_back(at_c(_val),_1)]);
}
};
}
使用g++4.5.1 boost 1.51编译它会产生大量错误

In file included from /usr/include/boost/spirit/home/phoenix/container.hpp:10:0,
                 from /usr/include/boost/spirit/home/phoenix.hpp:12,
                 from /usr/include/boost/spirit/include/phoenix.hpp:13,
                 from qi_test.cpp:2:
.....
qi_test.cpp:43:64:   instantiated from here
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40: error: ‘struct boost::fusion::vector<int>’ has no member named ‘push_back’
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40: error: return-statement with a value, in function returning 'void'
qi_test.cpp: In static member function ‘static 
.....
qi_test.cpp:43:64:   instantiated from here
qi_test.cpp:28:509: error: invalid initialization of reference of type boost::fusion::vector<int>&’ from expression of type ‘std::vector<int>’
在/usr/include/boost/spirit/home/phoenix/container.hpp:10:0中包含的文件中,
来自/usr/include/boost/spirit/home/phoenix.hpp:12,
从/usr/include/boost/spirit/include/phoenix.hpp:13,
来自qi_测试。cpp:2:
.....
qi_test.cpp:43:64:从此处实例化
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40:错误:“struct boost::fusion::vector”没有名为“push_back”的成员
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40:错误:返回值为的返回语句,在返回“void”的函数中
qi_test.cpp:在静态成员函数“static”中
.....
qi_test.cpp:43:64:从此处实例化
qi_test.cpp:28:509:错误:从'std::vector'类型的表达式初始化boost::fusion::vector和'from'类型的引用无效

基本上我很困惑。不知道出了什么问题。

这里混合了两种类型的向量模板类:

std::vector

如果你只是省略(注释掉)


事情可能会变得非常清楚

错误输出中有两种不同的
vector
类型。在您的代码中,尝试明确说明您使用的向量,即将
struct Argument
中的声明更改为
std::vector…
。难以置信@斯蒂芬马耶夫斯基,你说得对。这是另一种名称空间冲突。你愿意写一个简短的回答吗?这样我就可以结束这个问题了。
boost::fusion::vector
using std::vector;