在boost :: property_tree中查找运算符

时间:2017-11-22 18:01:01

标签: c++ namespaces operator-overloading boost-propertytree

在命名空间中有自定义类型,在父命名空间中有流操作符,编译器无法在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行中的调用有何不同?

不,我会真的不愿意将流媒体操作符移动到与该类相同的命名空间中。

0 个答案:

没有答案