2017-12-18 5 views
0

私は、カスタムLinux用のブーストプロパティツリーを使ってコンパイルしようとしています。ファイルjson_parser_read.hpp(行105)にエラーがありますコンパイルエラーのプロパティツリーを向上させるC++

struct a_literal_val 
    { 
     context &c; 
     a_literal_val(context &c): c(c) { } 
     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.name.clear(); 
      c.string.clear(); 
     } 
    }; 

このコードはコンパイルされません。 出力は次のとおりです。私は、ブーストv1.49

を使用してい/path/to/boost/property_tree/detail/json_parser_read.hpp:105: error: no matching function for call to 'boost::property_tree::basic_ptree<std::basic_string<char>, std::basic_string<char> >::push_back(std::pair<std::basic_string<char>, std::basic_string<char> >)' c.stack.back()->push_back(std::make_pair(c.name, Str(b, e))); ^

私は他のPCでテストし、それはバージョンで正しく助けるために1.58

感謝をコンパイルします。

+1

「コンテキスト」とは何ですか? 'c.stack'とは何ですか? 'c.stack.back()'によって返されるものは?私たちを表示するには、[最小、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。もちろん、[良い質問をする方法について](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+0

http://idownvotedbecau.se/beingunresponsive –

答えて

0

作成する必要があるSSCCEは次のとおりです。私は²、あなたのproblem¹を見ることができない。

Live On Coliru

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

using boost::property_tree::ptree; 

struct context { 
    std::string name, string; 
    std::deque<ptree *> stack; 
}; 

struct a_literal_val { 
    using Str = std::string; 

    context &c; 
    a_literal_val(context &c) : c(c) {} 

    template <typename It> 
    void operator()(It b, It e) const { 
     BOOST_ASSERT(c.stack.size() >= 1); 
     c.stack.back()->push_back(std::make_pair(c.name, ptree{Str(b, e)})); 
     c.name.clear(); 
     c.string.clear(); 
    } 
}; 

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

int main() { 
    boost::property_tree::ptree pt; 
    context ctx { "field1", "", { &pt } }; 

    a_literal_val visitor {ctx}; 

    std::string const value = "hello world"; 
    visitor(value.rbegin(), value.rend()); // reverse, for fun 

    write_json(std::cout, pt); 
} 

プリント

{ 
    "field1": "dlrow olleh" 
} 

あなたはおそらくXMLとしてブーストプロパティを乱用していることを除いて¹しましたまたはJSONライブラリ。ブーストは、のXMLまたはJSONライブラリを持っていません。

²はい私はあなたのサンプルがより複雑であることを知っています。ほとんどの場合、インターフェースコード用の「汎用」シリアライザを作成しています。私のクリスタルボールではさらに深く、ネストされたオブジェクトグラフを処理するためにBoost Fusionに適合した構造体を使用していると推測できます。それはすべて前に行われています。ポイントは、あなたが持っている問題を提示する必要があるか、誰も知らないことです。

+0

ところで、私はこの変更があなたの問題であることを認識しました:https://stackoverflow.com/q/47213341/85371 – sehe

関連する問題