【问题标题】:boost::property_tree::read_json in gcc 4.7.2 and boost 1.49 - compile-time errorsgcc 4.7.2 和 boost 1.49 中的 boost::property_tree::read_json - 编译时错误
【发布时间】:2025-11-30 03:35:02
【问题描述】:

我有以下代码:

#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>

#include <sstream>
#include <string>

int main()
{
  std::string input("{\"foo\":\"bar\"}");

  boost::property_tree::ptree pt;
  std::stringstream stream;
  stream << input;

  boost::property_tree::read_json(stream, pt);
}

在带有 boost 1.54 的 MSVC-11.0 中,这段代码编译得很好,但在带有 boost 1.49 的 gcc 4.7.2 中,这段代码给了我以下错误:

在包含的文件中 /usr/include/boost/property_tree/json_parser.hpp:14:0, 从 main.cpp:1: /usr/include/boost/property_tree/detail/json_parser_read.hpp: 在 'void 的实例化 boost::property_tree::json_parser::context::a_literal_val::operator()(boost::property_tree::json_parser::context::It, boost::property_tree::json_parser::context::It) const [with Ptree = boost::property_tree::basic_ptree, std::basic_string >; boost::property_tree::json_parser::context::It = __gnu_cxx::__normal_iterator > >]’: /usr/include/boost/spirit/home/classic/core/scanner/scanner.hpp:148:13: 从“静态无效”中需要 boost::spirit::classic::attributed_action_policy::call(const ActorT&, boost::spirit::classic::nil_t, const IteratorT&, const IteratorT&) [与 ActorT = boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val;迭代器T = __gnu_cxx::__normal_iterator > >]’ /usr/include/boost/spirit/home/classic/core/scanner/scanner.hpp:163:13: 需要从'void boost::spirit::classic::action_policy::do_action(const ActorT&, AttrT&, const IteratorT&, const IteratorT&) const [with ActorT = boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val;属性 = boost::spirit::classic::nil_t;迭代器T = __gnu_cxx::__normal_iterator > >]’ /usr/include/boost/spirit/home/classic/core/composite/actions.hpp:116:17: 需要从'类型名 boost::spirit::classic::parser_result, ScannerT>::type boost::spirit::classic::action::parse(const ScannerT&) const [with ScannerT = boost::spirit::classic::scanner<:__normal_iterator>>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme>

, boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>;解析器 = boost::spirit::classic::alternative >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >;行动T = boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val;类型名称 boost::spirit::classic::parser_result, ScannerT>::type = boost::spirit::classic::match]’ /usr/include/boost/spirit/home/classic/core/composite/alternative.hpp:67:59: 从'typename递归需要 boost::spirit::classic::parser_result, ScannerT>::type boost::spirit::classic::alternative::parse(const ScannerT&) const [with ScannerT = boost::spirit::classic::scanner<:__normal_iterator>>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>;一个= boost::spirit::classic::alternative >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::property_tree::json_parser::context, std::basic_string > >::a_string_val>, boost::spirit::classic::action >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val> >;乙 = boost::spirit::classic::rule >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t,boost::spirit::classic::nil_t>; 类型名称 boost::spirit::classic::parser_result, ScannerT>::type = boost::spirit::classic::match]’ /usr/include/boost/spirit/home/classic/core/composite/alternative.hpp:67:59: 需要从'类型名 boost::spirit::classic::parser_result, ScannerT>::type boost::spirit::classic::alternative::parse(const ScannerT&) const [with ScannerT = boost::spirit::classic::scanner<:__normal_iterator>>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>;一个= boost::spirit::classic::alternative >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::property_tree::json_parser::context, std::basic_string > >::a_string_val>, boost::spirit::classic::action >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val> >, boost::spirit::classic::rule >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t> >;乙 = boost::spirit::classic::rule >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t,boost::spirit::classic::nil_t>; 类型名称 boost::spirit::classic::parser_result, ScannerT>::type = boost::spirit::classic::match]’ /usr/include/boost/spirit/home/classic/core/non_terminal/impl/rule.ipp:240:36: 来自‘typename boost::spirit::classic::match_result::type boost::spirit::classic::impl::concrete_parser::do_parse_virtual(const ScannerT&) const [with ParserT = boost::spirit::classic::alternative >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::property_tree::json_parser::context, std::basic_string > >::a_string_val>, boost::spirit::classic::action >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::spirit::classic::strlit >, boost::property_tree::json_parser::context, std::basic_string > >::a_literal_val> >, boost::spirit::classic::rule >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t> >, boost::spirit::classic::rule >>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t> >; 扫描仪T = boost::spirit::classic::scanner<:__normal_iterator>>, boost::spirit::classic::scanner_policies, boost::spirit::classic::kleene_star, boost::spirit::classic::alternative, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::confix_parser, boost::spirit::classic::kleene_star, boost::spirit::classic::strlit, boost::spirit::classic::unary_parser_category, boost::spirit::classic::non_nested, boost::spirit::classic::is_lexeme> , boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy>>;属性 = boost::spirit::classic::nil_t;类型名称 boost::spirit::classic::match_result::type = boost::spirit::classic::match]’ main.cpp:16:1:从这里需要 /usr/include/boost/property_tree/detail/json_parser_read.hpp:105:17: 错误:没有匹配的调用函数 'boost::property_tree::basic_ptree, std::basic_string ::push_back(std::pair, std::basic_string >)’ /usr/include/boost/property_tree/detail/json_parser_read.hpp:105:17: 注意:候选人是:在包含的文件中 /usr/include/boost/property_tree/ptree.hpp:516:0, 从 /usr/include/boost/property_tree/json_parser.hpp:13, 从 main.cpp:1:/usr/include/boost/property_tree/detail/ptree_implementation.hpp:362:9: 注意: boost::property_tree::basic_ptree::iterator boost::property_tree::basic_ptree::push_back(const value_type&) [with Key = 标准::基本字符串;数据 = std::basic_string;键比较 = 标准::少>; boost::property_tree::basic_ptree::value_type = 标准::对, boost::property_tree::basic_ptree, std::basic_string > >] /usr/include/boost/property_tree/detail/ptree_implementation.hpp:362:9: 注意:参数 1 没有已知的转换 ‘std::pair, std::basic_string >’ 到 'const value_type& {aka const std::pair, boost::property_tree::basic_ptree, std::basic_string > >&}'

我做错了什么?我该如何解决?

【问题讨论】:

  • 您的错误消息已损坏,无法理解。它们的关键部分从底部开始,位于“/usr/include/boost/property_tree/detail/json_parser_read.hpp:105:17: error: no matching function”,但它列出的内容没有任何意义。
  • @Sebastian Redl 是的,我已经看到了,但根据文档,这种功能存在于 boost 1.49 - boost.org/doc/libs/1_49_0/boost/property_tree/json_parser.hpp
  • 错误是指库的内部。我正试图找出发生了什么,但因为消息是乱码而无法查明。
  • @Sebastian Redl 不幸的是,我没有任何其他信息
  • 我刚刚注意到,当我使用 -std=c++98 而不是 -std=c++11 时,我可以编译这段代码

标签: c++ boost


【解决方案1】:

正如 OP 问题的 cmets 中所述,当使用 boost::property_tree::read_json 时,boost 1.49 不能与 c++11 一起编译。这是一个known bug,可以通过使用更新版本的 boost 或应用以下补丁来解决:

--- json_parser_read.hpp        2013-09-01 03:55:57.000000000 +0400
+++ /usr/include/boost/property_tree/detail/json_parser_read.hpp        2013-09-01 03:56:21.000000000 +0400
@@ -102,7 +102,7 @@
             void operator()(It b, It e) const
             {
                 BOOST_ASSERT(c.stack.size() >= 1);
-                c.stack.back()->push_back(std::make_pair(c.name, Str(b, e)));
+                c.stack.back()->push_back(std::make_pair(c.name, Ptree(Str(b, e))));
                 c.name.clear();
                 c.string.clear();
             }

sed -i -e 's/std::make_pair(c.name, Str(b, e))/std::make_pair(c.name, Ptree(Str(b, e)))/' json_parser_read.hpp

描述了here

【讨论】: