比较boost属性树

时间:2015-11-06 19:16:42

标签: 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的内容是否相同吗?

1 个答案:

答案 0 :(得分:1)

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

<强> 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

这是GCC或Clang,在Boost 1.59(测试旧版本......)

<强>更新

您是否尝试过定义_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