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对象类型创建一个重载。这可以通过创建一个函数来完成,该函数接受您的Foo对象类型的成员,并通过 将它们传递operator<<ostream对象类型。这是一个非常简单的例子:

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

这是有效的,因为int您用作Foo对象类型成员的类型正在调用operator<<forostream和的重载版本int。因此,如果属于您的Foo类型的对象尚未重载,那么您还必须operator<<为这些类型创建重载函数。

完成此操作后,您的代码可以在任何地方调用,如下所示:

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 回答