在命名空间中有自定义类型,在父命名空间中有流操作符,编译器无法在boost::property_tree::ptree::get()
操作中找到运算符。例如:
#include <boost/property_tree/ptree.hpp>
namespace NS1 {
struct Foo { int foo; };
}
template<typename IStream>
IStream& operator>>(IStream& is, NS1::Foo& val) {
is >> val.foo;
return is;
}
namespace NS2 {
void bar() {
std::stringstream ss;
auto& is = static_cast<std::istream&>(ss);
NS1::Foo foo;
is >> foo; // line 1
}
}
int main() {
NS2::bar(); // line 2
boost::property_tree::ptree tree;
tree.get_value_optional<NS1::Foo>(); // line 3
}
在该示例中,除非将运算符移动到NS1
命名空间,否则编译器无法找到运算符。但只是第2行中没有第3行的调用会编译!在第1行之前,bar()
函数甚至将流转换为boost
在查找失败的customize_stream::extract()
函数中使用的相同类型。
我的主要问题是:第3行中的调用与查找失败的第2行中的调用有何不同?
不,我会真的不愿意将流媒体操作符移动到与该类相同的命名空间中。