Boost Spirit v2 gcc编译错误,它不会显示使用msvc

Vol*_*ire 2 c++ gcc boost

我最近在windows中写了一些精神解析代码,我最近试图在ubuntu框上构建并遇到了我正在努力解决的编译错误.

经过一些黑客攻击和削减,我设法提出了这个示例代码片段,它表现出相同的行为:

struct FooParser
: spirit::qi::grammar<
    std::string::const_iterator, 
    double(), 
    spirit::qi::ascii::space_type>
{
    FooParser() : FooParser::base_type(a_rule)
    {
        using namespace boost::spirit::qi;
        a_rule = double_;
    }

    spirit::qi::rule<
        string::const_iterator,
        double(),
        spirit::qi::ascii::space_type> a_rule;
};
Run Code Online (Sandbox Code Playgroud)

然后将其传递给phrase_parse,如下所示:

double result;
std::string txt;
FooParser foobar;
//...
if(phrase_parse(txt.begin(), txt.end(), foobar, space, result))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)

编译时,会生成以下错误:

boost/spirit/home/qi/reference.hpp:41: error: no matching function for call to 
‘boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char,
 std::char_traits<char>, std::allocator<char> > >, double(), 
boost::proto::exprns_::expr<boost::proto::tag::terminal, 
boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, 
boost::spirit::char_encoding::ascii> >, 0l>, boost::fusion::unused_type, 
boost::fusion::unused_type>::parse(__gnu_cxx::__normal_iterator<char*, 
std::basic_string<char, std::char_traits<char>, std::allocator<char> > >&, const 
__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > >&, const boost::fusion::unused_type&, const 
boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, 
boost::spirit::char_encoding::ascii> >&, double&) const’
Run Code Online (Sandbox Code Playgroud)

我觉得令人沮丧的是视觉工作室似乎非常乐意编译和运行代码.我希望明智的互联网可以告诉我我在哪里犯了错误.

Nim*_*Nim 5

我觉得这里的问题是begin()end()std::string,试试这个:

std::string::const_iterator begin = txt.begin();
std::string::const_iterator end = txt.end();
Run Code Online (Sandbox Code Playgroud)

然后通过:

phrase_parse(begin, end, foobar, space, result)
Run Code Online (Sandbox Code Playgroud)

我相信的问题是,在其他任何地方使用该类型const_iterator,但是begin(),end()在非const字符串上返回一个普通的迭代器.

错误的关键部分是这一点:

解析(__ gnu_cxx :: __normal_iterator,std :: allocator >> &&,const __gnu_cxx :: __normal_iterator,std :: allocator >>&