请考虑以下示例:
#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'
有人能建议正确的方法吗?
答案 0 :(得分:3)
只需为您的operator<<
对象类型创建一个重载Foo
。这可以通过创建一个函数来完成,该函数接收Foo
对象类型的成员,并通过operator<<
将它们传递给ostream
对象类型。这是一个非常简单的例子:
ostream& operator<<(ostream& out, Foo output_object)
{
out << egg << " " << bar;
return out;
}
这是有效的,因为您用作int
对象类型成员的Foo
类型正在为operator<<
和{{1}调用ostream
的重载版本}}。因此,如果属于int
类型的对象尚未超载,那么您还必须为这些类型创建重载的Foo
函数。
完成后,您可以在任何地方调用您的代码:
operator<<
此外,任何其他尝试将Foo test;
cout << test; //will print out whatever the values of "egg" and "bar" are
与operator<<
对象和ostream
类型用作操作数的代码也将正常运行。
最后,您可以Foo
重载函数并将其放在头文件中,或者您可以在头文件中创建函数声明,然后在其他地方的代码模块中定义函数。