C++11 错误包括boost/spirit/include/qi.hpp

C++11 错误包括boost/spirit/include/qi.hpp,c++11,boost,g++,boost-spirit,C++11,Boost,G++,Boost Spirit,我犯的错误与发生的错误相同。有关详细的错误消息,请参阅底部的“编译信息”。基本上,如果我包含,我就无法编译。完全被这件事难倒了。。。我正在使用C++11在Debian上使用g++4.9.3进行编译。作为参考,错误消息的第一部分是: In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0, from /usr/include/boost/spirit/home/qi

我犯的错误与发生的错误相同。有关详细的错误消息,请参阅底部的“编译信息”。基本上,如果我包含,我就无法编译。完全被这件事难倒了。。。我正在使用C++11在Debian上使用g++4.9.3进行编译。作为参考,错误消息的第一部分是:

In file included from /usr/include/boost/spirit/home/qi/nonterminal/rule.hpp:35:0,
             from /usr/include/boost/spirit/home/qi/nonterminal.hpp:14,
             from /usr/include/boost/spirit/home/qi.hpp:20,
             from /usr/include/boost/spirit/include/qi.hpp:16,
             from prog.cpp:9:
/usr/include/boost/spirit/home/qi/reference.hpp: In instantiation of 'bool boost::spirit::qi::reference<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<std::basic_string<char>&, boost::fusion::nil_>, boost::spirit::locals<> >; Skipper = boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >; Attribute = std::basic_string<char>; Subject = const boost::spirit::qi::rule<__gnu_cxx::__normal_iterator<const char*, std::basic_string<char> >, std::basic_string<char>(), 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::ascii> >, 0l>, boost::spirit::unused_type, boost::spirit::unused_type>]':

字符串不是常量,因此迭代器
first
last
不是常量迭代器

要么使
my_Parse
函数不是模板(毕竟,您硬编码语法上的迭代器类型为
std::string::const_迭代器
),要么用实际的迭代器类型实例化语法:

my_grammar<Iterator> g;
my_语法g;

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

#include <stdio.h>

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

template <typename Iterator>
struct my_grammar : boost::spirit::qi::grammar<Iterator, std::string(), ascii::space_type>
{

    my_grammar() : my_grammar::base_type(start)
    {
        using qi::alpha;
        using qi::alnum;

        start %=
            (+alpha | +alnum)
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> start;
};

template <typename Iterator>
bool my_Parse(Iterator first, Iterator last, std::string& result)
{
    using boost::spirit::ascii::space;

    my_grammar<Iterator> g;

    bool r = phrase_parse(first, last, g, space, result);

    if (!r || first != last) // fail if we did not get a full match
        return false;

    return r;
}



int main() {
    std::string str;
    while (getline(std::cin, str))
    {
        std::string result = "";
        if (my_Parse(str.begin(), str.end(), result))
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing succeeded\n";
            std::cout << "got: " << result << std::endl;
            std::cout << "\n-------------------------\n";
        }
        else
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing failed\n";
            std::cout << "-------------------------\n";
        }
    }
}
#包括
#包括
#包括
名称空间qi=boost::spirit::qi;
名称空间ascii=boost::spirit::ascii;
名称空间phoenix=boost::phoenix;
模板
struct my_语法:boost::spirit::qi::语法
{
我的语法():我的语法::基本类型(开始)
{
使用qi::alpha;
使用qi::alnum;
起始百分比=
(+alpha |+alnum)
;
}
qi::规则开始;
};
模板
boolmy_解析(迭代器优先,迭代器最后,std::string&result)
{
使用boost::spirit::ascii::space;
我的语法;
bool r=短语解析(第一、最后、g、空格、结果);
如果(!r | | first!=last)//如果我们没有得到完全匹配,则失败
返回false;
返回r;
}
int main(){
std::字符串str;
while(getline(std::cin,str))
{
std::string result=“”;
if(my_Parse(str.begin(),str.end(),result))
{

std::请做一个适当的问题标题(包括标题没有任何问题,你可以很容易地检查)。包括相关代码。很明显,它在第9行的#Include in prog.cpp上失败了。当然不是。请评论
短语_parse
call。或者,阅读我的答案。好的,我明白你的意思。谢谢你帮助我sehe。我的代码实际上与我在ideone上找到的示例略有不同。如果我评论掉短语#阿瑟呼叫它编译,但我不知道如何修复对短语_parse的呼叫你怎么能不?你…没有看到我的答案吗?它已经52分钟了。附带一个在coliru上直播的工作示例。。。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

#include <stdio.h>

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

template <typename Iterator>
struct my_grammar : boost::spirit::qi::grammar<Iterator, std::string(), ascii::space_type>
{

    my_grammar() : my_grammar::base_type(start)
    {
        using qi::alpha;
        using qi::alnum;

        start %=
            (+alpha | +alnum)
            ;
    }

    qi::rule<Iterator, std::string(), ascii::space_type> start;
};

template <typename Iterator>
bool my_Parse(Iterator first, Iterator last, std::string& result)
{
    using boost::spirit::ascii::space;

    my_grammar<Iterator> g;

    bool r = phrase_parse(first, last, g, space, result);

    if (!r || first != last) // fail if we did not get a full match
        return false;

    return r;
}



int main() {
    std::string str;
    while (getline(std::cin, str))
    {
        std::string result = "";
        if (my_Parse(str.begin(), str.end(), result))
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing succeeded\n";
            std::cout << "got: " << result << std::endl;
            std::cout << "\n-------------------------\n";
        }
        else
        {
            std::cout << "-------------------------\n";
            std::cout << "Parsing failed\n";
            std::cout << "-------------------------\n";
        }
    }
}