提升json_parser警告C4715

时间:2017-11-06 11:56:35

标签: c++ json boost

我试图在boost::property_tree:ptree对象中保存一些数据:

const char* data = "Here are json params";
boost:property_tree:ptree tr;
std::stringstream ss;
ss << data;

//Here i get warning
boost::property_tree:ptree::read_json(ss, tr);

警告如下:

boost\property_tree\detail\json_parser\standard_callbacks.hpp(132): warning C4715: 'boost::property_tree::json_parser::detail::standard_callbacks<boost::property_tree::basic_ptree<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > >::new_tree' : not all control paths return a value

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

这不是问题。它与Boost有关,而不是你的代码。如果您愿意,可以忽略警告或在IDE中将其禁止。错误是Ptree& new_tree技术上可以在没有return语句的情况下完成。这是代码:

Ptree& new_tree() {
    if (stack.empty()) {
        layer l = {leaf, &root};
        stack.push_back(l);
        return root;
    }

    layer& l = stack.back();

    switch (l.k) {
        case array: {
                l.t->push_back(std::make_pair(string(), Ptree()));
                layer nl = {leaf, & l.t->back().second};
                stack.push_back(nl);
                return *stack.back().t;
            }

        case object:
        default:
            BOOST_ASSERT(false); // must start with string, i.e. call new_value

        case key: {
                l.t->push_back(std::make_pair(key_buffer, Ptree()));
                l.k = object;
                layer nl = {leaf, &l.t->back().second};
                stack.push_back(nl);
                return *stack.back().t;
            }

        case leaf:
            stack.pop_back();
            return new_tree();
    }
}

正如您所看到的,在切换中有一个default: BOOST_ASSERT(false),这意味着当函数没有返回任何内容时,它也会触发您的调试器立即停止,因为出现了可怕的错误。您的编译器不够聪明,无法自行计算,因此它会向您发出警告。在这种情况下,您绝对可以忽略该警告。

答案 1 :(得分:1)

该函数包含switch,其中一个案例为

        default:
            BOOST_ASSERT(false); // must start with string, i.e. call new_value

可以说这部分没有返回值,但主要是因为它根本没有返回。