【发布时间】: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 时,我可以编译这段代码