c++ - 比较boost属性树

标签 c++ boost boost-propertytree

是否可以比较两个属性树? ptree.hpp 中有 == 和 != 的运算符重载,但使用它们会给我一个编译器错误。

    ptree a;
    ptree b;

    auto match = (a == b);

结果:

2>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility(2798): error C4996: 'std::_Equal1': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
2>          c:\program files (x86)\microsoft visual studio 12.0\vc\include\xutility(2783) : see declaration of 'std::_Equal1'
2>          c:\boost\1_57_0-msvc-12.0-32\boost\multi_index\sequenced_index.hpp(953) : see reference to function template instantiation 'bool std::equal<boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<Super>>,boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<Super>>>(_InIt1,_InIt1,_InIt2)' being compiled
2>          with
2>          [
2>              Super=boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>>>>
2>  ,            _InIt1=boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>>>>>>
2>  ,            _InIt2=boost::multi_index::detail::bidir_node_iterator<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>>>>>>
2>          ]
2>          c:\boost\1_57_0-msvc-12.0-32\boost\multi_index_container.hpp(1263) : see reference to function template instantiation 'bool boost::multi_index::detail::operator ==<SuperMeta,boost::mpl::vector0<boost::mpl::na>,SuperMeta,boost::mpl::vector0<boost::mpl::na>>(const boost::multi_index::detail::sequenced_index<SuperMeta,boost::mpl::vector0<boost::mpl::na>> &,const boost::multi_index::detail::sequenced_index<SuperMeta,boost::mpl::vector0<boost::mpl::na>> &)' being compiled
2>          with
2>          [
2>              SuperMeta=boost::multi_index::detail::nth_layer<1,std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>::subs::by_name,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::member<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,pointer-to-member(0x0)>,std::less<std::string>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>>>
2>          ]
2>          c:\boost\1_57_0-msvc-12.0-32\boost\property_tree\detail\ptree_implementation.hpp(417) : see reference to function template instantiation 'bool boost::multi_index::operator ==<std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>::subs::by_name,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::member<std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,pointer-to-member(0x0)>,std::less<_Kty>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>,std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>::subs::by_name,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::member<std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,pointer-to-member(0x0)>,std::less<_Kty>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>>(const boost::multi_index::multi_index_container<Value,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>::subs::by_name,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::member<std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,pointer-to-member(0x0)>,std::less<_Kty>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>> &,const boost::multi_index::multi_index_container<Value,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>>,boost::multi_index::ordered_non_unique<boost::multi_index::tag<boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>::subs::by_name,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,boost::multi_index::member<std::pair<const Key,boost::property_tree::basic_ptree<Key,std::string,std::less<_Kty>>>,const std::basic_string<char,std::char_traits<char>,std::allocator<char>>,pointer-to-member(0x0)>,std::less<_Kty>>,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na,boost::mpl::na>,std::allocator<Value>> &)' being compiled
2>          with
2>          [
2>              Key=std::string
2>  ,            _Kty=std::string
2>  ,            Value=std::pair<const std::string,boost::property_tree::basic_ptree<std::string,std::string,std::less<std::string>>>
2>          ]
2>          c:\boost\1_57_0-msvc-12.0-32\boost\property_tree\detail\ptree_implementation.hpp(414) : while compiling class template member function 'bool boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>>::operator ==(const boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>> &) const'
2>          with
2>          [
2>              _Kty=std::string
2>          ]
2>          b.cpp(63) : see reference to function template instantiation 'bool boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>>::operator ==(const boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>> &) const' being compiled
2>          with
2>          [
2>              _Kty=std::string
2>          ]
2>          b.cpp(57) : see reference to class template instantiation 'boost::property_tree::basic_ptree<std::string,std::string,std::less<_Kty>>' being compiled
2>          with
2>          [
2>              _Kty=std::string
2>          ]

如果这些运算符还不够,是否有另一种方法来确定 ptree 的内容是否相同?

最佳答案

当然你可以实现你自己的,但上面的应该工作:

Live On Coliru

#include <boost/property_tree/ptree.hpp>

using boost::property_tree::ptree;

int main() {
    ptree a;
    ptree b;

    return (a==b)? 1 : 2;
}

返回 1

在 Boost 1.59 上使用 GCC 或 Clang(测试旧版本...)

更新

您是否尝试过定义 _SCL_SECURE_NO_WARNINGS

error C4996: 'std::_Equal1': Function call with parameters that may be unsafe -
this call relies on the caller to check that the passed values are correct. To
disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how

关于c++ - 比较boost属性树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33574067/

相关文章:

c++ - 数组订阅 : returning Reference vs proxy class method

c++ - 当我使用可变参数时,它适用于 int 和 double,但是当涉及到 float 时,就会出错

c++ - boost::lexical_cast 如何只采用一种模板类型?

c++ - 遍历不包含标签名称的 PTree 子项

c++ - Boost ptree 数字数组

c++ - 访问 ptree 数组中的特定索引

c++ - 如何在不解析的情况下将重载函数指针作为参数传递 (C++03)

c++ - [c++]为什么我的类析构函数被调用了两次?

c++ - cv::Mat 的序列化给出了奇怪的结果

c++ - 将 boost::uuid 转换为 char*