diff --git a/doc/changes.qbk b/doc/changes.qbk index 839b370f..54002878 100644 --- a/doc/changes.qbk +++ b/doc/changes.qbk @@ -276,5 +276,7 @@ C++11 support has resulted in some breaking changes: * Remove `BOOST_UNORDERED_DEPRECATED_EQUALITY` warning. * Simpler implementation of assignment, fixes an exception safety issue for `unordered_multiset` and `unordered_multimap`. Might be a little slower. +* Stop using return value SFINAE which some older compilers have issues + with. [endsect] diff --git a/include/boost/unordered/detail/equivalent.hpp b/include/boost/unordered/detail/equivalent.hpp index 407b5f79..b7b40f1a 100644 --- a/include/boost/unordered/detail/equivalent.hpp +++ b/include/boost/unordered/detail/equivalent.hpp @@ -484,8 +484,8 @@ namespace boost { namespace unordered { namespace detail { // if hash function throws, or inserting > 1 element, basic exception // safety. Strong otherwise template - typename boost::unordered::detail::enable_if_forward::type - insert_range(I i, I j) + void insert_range(I i, I j, typename + boost::unordered::detail::enable_if_forward::type = 0) { if(i == j) return; @@ -508,8 +508,8 @@ namespace boost { namespace unordered { namespace detail { } template - typename boost::unordered::detail::disable_if_forward::type - insert_range(I i, I j) + void insert_range(I i, I j, typename + boost::unordered::detail::disable_if_forward::type = 0) { node_constructor a(this->node_alloc()); for (; i != j; ++i) { diff --git a/include/boost/unordered/detail/util.hpp b/include/boost/unordered/detail/util.hpp index 14dcfd84..0a406c85 100644 --- a/include/boost/unordered/detail/util.hpp +++ b/include/boost/unordered/detail/util.hpp @@ -125,17 +125,15 @@ namespace boost { namespace unordered { namespace detail { // insert_size/initial_size template - inline typename - boost::unordered::detail::enable_if_forward::type - insert_size(I i, I j) + inline std::size_t insert_size(I i, I j, typename + boost::unordered::detail::enable_if_forward::type = 0) { return std::distance(i, j); } template - inline typename - boost::unordered::detail::disable_if_forward::type - insert_size(I, I) + inline std::size_t insert_size(I, I, typename + boost::unordered::detail::disable_if_forward::type = 0) { return 1; } diff --git a/test/unordered/erase_tests.cpp b/test/unordered/erase_tests.cpp index 4135af4d..9c737bd8 100644 --- a/test/unordered/erase_tests.cpp +++ b/test/unordered/erase_tests.cpp @@ -95,12 +95,16 @@ void erase_tests1(Container*, test::random_generator generator) BOOST_DEDUCED_TYPENAME Container::key_type key = test::get_key(*pos); std::size_t count = x.count(key); + BOOST_TEST(count > 0); BOOST_TEST(next == x.erase(pos)); --size; if(size > 0) BOOST_TEST(index == 0 ? next == x.begin() : next == boost::next(prev)); BOOST_TEST(x.count(key) == count - 1); + if (x.count(key) != count - 1) { + std::cerr << count << " => " << x.count(key) << std::endl; + } BOOST_TEST(x.size() == size); if (++iterations % 20 == 0) test::check_equivalent_keys(x); } @@ -180,12 +184,16 @@ void erase_tests1(Container*, test::random_generator generator) BOOST_DEDUCED_TYPENAME Container::key_type key = test::get_key(*pos); std::size_t count = x.count(key); + BOOST_TEST(count > 0); x.quick_erase(pos); --size; if(size > 0) BOOST_TEST(index == 0 ? next == x.begin() : next == boost::next(prev)); BOOST_TEST(x.count(key) == count - 1); + if (x.count(key) != count - 1) { + std::cerr << count << " => " << x.count(key) << std::endl; + } BOOST_TEST(x.size() == size); if (++iterations % 20 == 0) test::check_equivalent_keys(x); } diff --git a/test/unordered/find_tests.cpp b/test/unordered/find_tests.cpp index a310d40c..45151e99 100644 --- a/test/unordered/find_tests.cpp +++ b/test/unordered/find_tests.cpp @@ -40,8 +40,10 @@ void find_tests1(X*, test::random_generator generator) iterator pos = x.find(key); BOOST_DEDUCED_TYPENAME X::const_iterator const_pos = x_const.find(key); + BOOST_TEST(pos != x.end()); BOOST_TEST(pos != x.end() && x.key_eq()(key, test::get_key(*pos))); + BOOST_TEST(const_pos != x_const.end()); BOOST_TEST(const_pos != x_const.end() && x_const.key_eq()(key, test::get_key(*const_pos)));