2017-07-22 20 views
1

をブーストプロパティツリーの子を削除しようとする試みで、私はC++:ブーストptreeでは、子供を削除します。noマッチング機能

pt0.erase(pt_child); 

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> > >&)’ 

につながるerase機能で直接ノードを使用

コードの正しい形式は何ですか?

#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; 
} 
+0

全体エラーメッセージを投稿してください。 –

+0

@yurikilochek、ok。 – ar2015

+0

トピックから: 'write_json(std :: cout、p)'だけでstringstreamを渡す必要はありません。 –

答えて

0

docsによるとすることができますのみ.erasekey_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(); 
+0

@ ar2015あなたは[docs](http://www.boost.org/doc/libs/1_64_0/doc/html/boost/property_tree/basic_ptree.html#idp683462128-bb)を自分で読んでみませんか? –

+0

エラー: '['トークン 'for(auto&[key、data]:pt0)'の前にunqualified-idが必要です。エラー: 'key'はこのスコープ内で宣言されていません。 'data'はこのスコープ内で宣言されていません。 – ar2015

+0

@ ar2015これはC++の構文です。それまでは 'for(auto&pt_child:pt0)pt0.erase(pt_child.first);' –

1

これを行うことができます:ptree.get_child( "path.to")。erase( "child");これは、パス "path.to"内の "child"という名前のすべてのノードとその子要素を削除することに注意してください。

関連する問題