Ошибка компиляции gcc Boost Spirit v2, которая не отображается при использовании msvc - PullRequest
2 голосов
/ 31 января 2011

Я недавно написал некоторый код парсинга в Windows, который я недавно пытался собрать на Ubuntu Box, и столкнулся с ошибкой компиляции, с которой я борюсь.

После некоторого взлома и слэша,Мне удалось придумать этот пример кода, который демонстрирует такое же поведение:

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;
};

, который затем передается фразе: например,

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

И при компиляции генерируетследующая ошибка:

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’

Я разочарован тем, что Visual Studio более чем рада компилировать и запускать код.Я надеюсь, что мудрые интернет-специалисты покажут мне, где я ошибся.

1 Ответ

5 голосов
/ 31 января 2011

Я думаю, что проблема здесь в begin() и end() из std::string, попробуйте это:

std::string::const_iterator begin = txt.begin();
std::string::const_iterator end = txt.end();

затем передайте это в:

phrase_parse(begin, end, foobar, space, result)

Проблема, которую я считаю, заключается в том, что везде вы используете тип const_iterator, но begin(), end() в неконстантной строке возвращает обычный итератор.

Ключевой частью ошибки является этот бит:

parse (__ gnu_cxx :: __ normal_iterator , std :: allocator>> &, const __gnu_cxx :: __ normal_iterator , std :: allocator>> &

...