C ++ 11 — C ++: увеличить ptree удалить потомков: нет соответствующей функции

В попытке удалить дочерние элементы дерева свойств повышения, я использую прямой узел в erase функция, которая приводит к

error: no matching function for call to
‘boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>,
std::__cxx11::basic_string<char> >::erase(std::pair<const
std::__cxx11::basic_string<char>,
boost::property_tree::basic_ptree<std::__cxx11::basic_string<char>,
std::__cxx11::basic_string<char> > >&)’

в

pt0.erase(pt_child);

Какова правильная форма кода?

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

using namespace boost::property_tree;

void print(const ptree &p)
{
json_parser::write_json(std::cout, p);
}

int main()
{
ptree pt0;

for(int i=0;i<10;i++)
pt0.put_child("kid"+std::to_string(i+1),ptree());
print(pt0);

for(auto& pt_child : pt0)
pt0.erase(pt_child);
print(pt0);

return 0;
}

1

Решение

В соответствии с документы ты можешь только .erase от key_type или iterator, но вы пытаетесь сделать это путем value_type,

Вы можете сделать либо сделать

for(auto& [key, data]: pt0)
pt0.erase(key);

или перебрать итераторы явно:

for(auto it = pt0.begin(); it != pt0.end(); ++it)
pt0.erase(it);

Но так как вы все равно удаляете всех детей, лучшим способом было бы просто

pt0.clear();
-1

Другие решения

Вы можете сделать это: ptree.get_child («path.to»). Erase («child»); Обратите внимание, что при этом удаляются ВСЕ узлы с именем child в пути path.to и их дочерние элементы.

1

По вопросам рекламы [email protected]