[英]Operator lookup in boost::property_tree
在名称空间中具有自定义类型,在父名称空间中具有streaming-operator,编译器无法在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行中查找失败的调用有何不同?
不,我真的不希望将流运算符移到与该类相同的名称空间中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.