boost::spirit::x3编译错误
Compile error with boost::spirit::x3
我尝试编译示例文件与gcc 5.3.1 (5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
), boost 1.61.0
#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;
}
编译命令是:g++ test.cpp -std=c++1y
(我刚刚重命名了文件)
我得到了以下错误:
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&)>());
^
我想知道是什么导致这个错误?
p。
注意看起来您链接的错误的示例文件。我的答案响应错误消息中显示的代码。
我不能重现这个问题,但我记得曾经看到过类似的情况。
似乎GCC有时在为多态lambda参数类型做ADL时遇到麻烦。
我绕过它的方法是在那里禁用ADL:
auto f = [](auto& ctx){ std::cout << x3::_attr(ctx) << std::endl; };
或:
auto f = [](auto& ctx){ std::cout << (_attr)(ctx) << std::endl; };
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译