1

次の例を検討してください。

#include <boost\property_tree\ptree.hpp>
#include <boost/any.hpp>

typedef boost::property_tree::ptree PT;

struct Foo
{
    int bar;
    int egg;
    Foo(): bar(), egg() {}
};


int main()
{
    Foo foo;
    foo.bar = 5;
    PT pt;
    pt.put<Foo>("foo", foo);
    return 0;
}

私は後押しするのが初めてで、Foo オブジェクトをプロパティ ツリーに入れたいと思っています。上記の例はコンパイルされず、エラーが発生します。

c:\mingw\bin\../lib/gcc/mingw32/4.5.2/../../../../include/boost/property_tree/stream_translator.hpp:33:13: error: no match for 'operator<<' in 's << e'

誰かがそれを行う正しい方法を提案できますか?

4

1 に答える 1

3

オブジェクトタイプのオーバーロードoperator<<を作成するだけです。これは、オブジェクト タイプのメンバーを受け取り、それらを を介してオブジェクト タイプに渡すFoo関数を作成することで実行できます。非常に簡単な例を次に示します。Foooperator<<ostream

ostream& operator<<(ostream& out, Foo output_object)
{
    out << egg << " " << bar;
    return out;
}

オブジェクト型intのメンバーとして使用している型がforおよびのオーバーロードされたバージョンを呼び出しているため、これは機能します。したがって、型の一部であるオブジェクトがまだオーバーロードされていない場合は、それらの型に対してもオーバーロードされた関数を作成する必要があります。Foooperator<<ostreamintFoooperator<<

これが完了すると、コードは次のようにどこでも呼び出すことができます。

Foo test;
cout << test; //will print out whatever the values of "egg" and "bar" are

operator<<さらに、ostreamオブジェクトとFoo型をオペランドとして使用しようとする他のコードも正しく機能します。

最後に、inlineオーバーロードされた関数をヘッダー ファイルに配置するか、ヘッダーで関数宣言を作成してから、別の場所のコード モジュールで関数を定義することができます。

于 2011-09-27T18:17:53.590 に答える