2016-07-05 22 views
0

Ich habe versucht, example file mit gcc 5.3.1 (5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)), Boost 1.61.0 kompilieren.Kompilierfehler mit boost :: spirit :: x3

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/home/x3.hpp> 

#include <iostream> 

// Presented are various ways to attach semantic actions 
// * Using plain function pointer 
// * Using simple function object 

namespace client 
{ 
    namespace x3 = boost::spirit::x3; 
    using x3::_attr; 

    struct print_action 
    {  
     template <typename Context> 
     void operator()(Context const& ctx) const 
     { 
      std::cout << _attr(ctx) << std::endl; 
     } 
    }; 
} 

int main() 
{ 
    using boost::spirit::x3::int_; 
    using boost::spirit::x3::parse; 
    using client::print_action; 

    { // example using function object 

     char const *first = "{43}", *last = first + std::strlen(first); 
     parse(first, last, '{' >> int_[print_action()] >> '}'); 
    } 

    { // example using C++14 lambda 

     char const *first = "{44}", *last = first + std::strlen(first); 
     auto f = [](auto& ctx){ std::cout << _attr(ctx) << std::endl; }; 
     parse(first, last, '{' >> int_[f] >> '}'); 
    } 

    return 0; 
} 

Der Kompilierungsbefehl ist: g++ test.cpp -std=c++1y (I umbenannt nur die Datei.)

ich folgende Fehlermeldung bekam:

test.cpp: In instantiation of ‘main()::<lambda(auto:1&)> [with auto:1 = const boost::spirit::x3::context<boost::spirit::x3::attr_context_tag, int, boost::spirit::x3::context<boost::spirit::x3::where_context_tag, boost::iterator_range<const char*>, boost::spirit::x3::context<boost::spirit::x3::rule_val_context_tag, const boost::spirit::x3::unused_type, boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type> > > >]’: 
/usr/local/include/boost/spirit/home/x3/support/utility/is_callable.hpp:20:35: required from ‘struct boost::spirit::x3::is_callable<main()::<lambda(auto:1&)>(const boost::spirit::x3::context<boost::spirit::x3::attr_context_tag, int, boost::spirit::x3::context<boost::spirit::x3::where_context_tag, boost::iterator_range<const char*>, boost::spirit::x3::context<boost::spirit::x3::rule_val_context_tag, const boost::spirit::x3::unused_type, boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type> > > >&)>’ 
/usr/local/include/boost/spirit/home/x3/core/call.hpp:72:28: required from ‘auto boost::spirit::x3::call(F, Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) [with F = main()::<lambda(auto:1&)>; Iterator = const char*; Context = boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type>; RuleContext = const boost::spirit::x3::unused_type; Attribute = int]’ 
/usr/local/include/boost/spirit/home/x3/core/action.hpp:45:17: required from ‘bool boost::spirit::x3::action<Subject, Action>::call_action(Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RuleContext = const boost::spirit::x3::unused_type; Attribute = int; Subject = boost::spirit::x3::int_parser<int>; Action = main()::<lambda(auto:1&)>]’ 
/usr/local/include/boost/spirit/home/x3/core/action.hpp:57:32: required from ‘bool boost::spirit::x3::action<Subject, Action>::parse_main(Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RuleContext = const boost::spirit::x3::unused_type; Attribute = int; Subject = boost::spirit::x3::int_parser<int>; Action = main()::<lambda(auto:1&)>]’ 
/usr/local/include/boost/spirit/home/x3/operator/sequence.hpp:32:17: recursively required from ‘bool boost::spirit::x3::sequence<Left, Right>::parse(Iterator&, const Iterator&, const Context&, RContext&, boost::spirit::x3::unused_type) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RContext = const boost::spirit::x3::unused_type; Left = boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>; Right = boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> >]’ 
/usr/local/include/boost/spirit/home/x3/operator/sequence.hpp:32:17: required from ‘bool boost::spirit::x3::sequence<Left, Right>::parse(Iterator&, const Iterator&, const Context&, RContext&, boost::spirit::x3::unused_type) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RContext = const boost::spirit::x3::unused_type; Left = boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >; Right = boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>]’ 
/usr/local/include/boost/spirit/home/x3/core/parse.hpp:35:68: required from ‘bool boost::spirit::x3::parse_main(Iterator&, Iterator, const Parser&, Attribute&) [with Iterator = const char*; Parser = boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >, boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type> >; Attribute = const boost::spirit::x3::unused_type]’ 
/usr/local/include/boost/spirit/home/x3/core/parse.hpp:71:26: required from ‘bool boost::spirit::x3::parse(Iterator&, Iterator, const Parser&) [with Iterator = const char*; Parser = boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >, boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type> >]’ 
test.cpp:47:49: required from here 
test.cpp:46:51: 错误:use of ‘template<class Context> decltype(auto) boost::spirit::x3::_attr(const Context&)’ before deduction of ‘auto’ 
     auto f = [](auto& ctx){ std::cout << _attr(ctx) << std::endl; }; 
               ^
test.cpp:46:51: 错误:use of ‘decltype(auto) boost::spirit::x3::_attr(const Context&) [with Context = boost::spirit::x3::context<boost::spirit::x3::attr_context_tag, int, boost::spirit::x3::context<boost::spirit::x3::where_context_tag, boost::iterator_range<const char*>, boost::spirit::x3::context<boost::spirit::x3::rule_val_context_tag, const boost::spirit::x3::unused_type, boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type> > > >]’ before deduction of ‘auto’ 
In file included from /usr/local/include/boost/spirit/home/x3/core/action.hpp:13:0, 
       from /usr/local/include/boost/spirit/home/x3/core.hpp:14, 
       from /usr/local/include/boost/spirit/home/x3.hpp:20, 
       from test.cpp:8: 
/usr/local/include/boost/spirit/home/x3/core/call.hpp: In instantiation of ‘auto boost::spirit::x3::call(F, Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) [with F = main()::<lambda(auto:1&)>; Iterator = const char*; Context = boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type>; RuleContext = const boost::spirit::x3::unused_type; Attribute = int]’: 
/usr/local/include/boost/spirit/home/x3/core/action.hpp:45:17: required from ‘bool boost::spirit::x3::action<Subject, Action>::call_action(Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RuleContext = const boost::spirit::x3::unused_type; Attribute = int; Subject = boost::spirit::x3::int_parser<int>; Action = main()::<lambda(auto:1&)>]’ 
/usr/local/include/boost/spirit/home/x3/core/action.hpp:57:32: required from ‘bool boost::spirit::x3::action<Subject, Action>::parse_main(Iterator&, const Iterator&, const Context&, RuleContext&, Attribute&) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RuleContext = const boost::spirit::x3::unused_type; Attribute = int; Subject = boost::spirit::x3::int_parser<int>; Action = main()::<lambda(auto:1&)>]’ 
/usr/local/include/boost/spirit/home/x3/operator/sequence.hpp:32:17: recursively required from ‘bool boost::spirit::x3::sequence<Left, Right>::parse(Iterator&, const Iterator&, const Context&, RContext&, boost::spirit::x3::unused_type) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RContext = const boost::spirit::x3::unused_type; Left = boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>; Right = boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> >]’ 
/usr/local/include/boost/spirit/home/x3/operator/sequence.hpp:32:17: required from ‘bool boost::spirit::x3::sequence<Left, Right>::parse(Iterator&, const Iterator&, const Context&, RContext&, boost::spirit::x3::unused_type) const [with Iterator = const char*; Context = boost::spirit::x3::unused_type; RContext = const boost::spirit::x3::unused_type; Left = boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >; Right = boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>]’ 
/usr/local/include/boost/spirit/home/x3/core/parse.hpp:35:68: required from ‘bool boost::spirit::x3::parse_main(Iterator&, Iterator, const Parser&, Attribute&) [with Iterator = const char*; Parser = boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >, boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type> >; Attribute = const boost::spirit::x3::unused_type]’ 
/usr/local/include/boost/spirit/home/x3/core/parse.hpp:71:26: required from ‘bool boost::spirit::x3::parse(Iterator&, Iterator, const Parser&) [with Iterator = const char*; Parser = boost::spirit::x3::sequence<boost::spirit::x3::sequence<boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type>, boost::spirit::x3::action<boost::spirit::x3::int_parser<int>, main()::<lambda(auto:1&)> > >, boost::spirit::x3::literal_char<boost::spirit::char_encoding::standard, boost::spirit::x3::unused_type> >]’ 
test.cpp:47:49: required from here 
/usr/local/include/boost/spirit/home/x3/core/call.hpp:72:28: 错误:use of ‘auto boost::spirit::x3::detail::call(F, const Context&, mpl_::true_) [with F = main()::<lambda(auto:1&)>; Context = boost::spirit::x3::context<boost::spirit::x3::attr_context_tag, int, boost::spirit::x3::context<boost::spirit::x3::where_context_tag, boost::iterator_range<const char*>, boost::spirit::x3::context<boost::spirit::x3::rule_val_context_tag, const boost::spirit::x3::unused_type, boost::spirit::x3::context<boost::spirit::x3::parse_pass_context_tag, bool, boost::spirit::x3::unused_type> > > >; mpl_::true_ = mpl_::bool_<true>]’ before deduction of ‘auto’ 
     return detail::call(f, attr_context, is_callable<F(decltype(attr_context) const&)>()); 
          ^

Ich frage mich, was zu diesem Fehler führt?

S.S: In der Datei bedeutet Error Fehler.

+0

Hinweis Es ist wie Sie die falsche Beispieldatei verknüpft sieht. Meine Antwort reagiert stattdessen auf den Code, der in der Fehlermeldung angezeigt wird. – sehe

+0

Kompilieren Sie außerdem mit 'LANG = C g ++ -std = C++ 1y test.cpp', um sinnvolle Fehlermeldungen für die Freigabe zu erhalten. – sehe

Antwort

2

Ich kann das Problem nicht reproduzieren, aber ich erinnere mich daran, etwas ähnliches einmal zu sehen.

Es scheint, GCC hat manchmal Probleme ADL für einen polymorphen Lambda-Parameter-Typ zu tun.

Die Art, wie ich dazu gekommen, es war ADL es zu deaktivieren:

auto f = [](auto& ctx){ std::cout << x3::_attr(ctx) << std::endl; }; 

oder:

auto f = [](auto& ctx){ std::cout << (_attr)(ctx) << std::endl; }; 
+0

Ich habe die Beispieldatei auf die richtige aktualisiert und dein Trick funktioniert! –

Verwandte Themen