From 22670777b806f66af0b3eb95581b3bb62b8f1db1 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Wed, 19 Nov 2003 22:03:48 +0000 Subject: [PATCH] Change the way input_output_iterator_tag is convertible to output_iterator_tag from inheritance to implicit conversion operator, to avoid some tag dispatch ambiguities. [SVN r20868] --- .../iterator/detail/facade_iterator_category.hpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/include/boost/iterator/detail/facade_iterator_category.hpp b/include/boost/iterator/detail/facade_iterator_category.hpp index 5766d0a..9b2aa1a 100755 --- a/include/boost/iterator/detail/facade_iterator_category.hpp +++ b/include/boost/iterator/detail/facade_iterator_category.hpp @@ -37,7 +37,19 @@ namespace boost { struct use_default; } namespace boost { namespace detail { struct input_output_iterator_tag - : std::input_iterator_tag, std::output_iterator_tag {}; + : std::input_iterator_tag +{ + // Using inheritance for only input_iterator_tag helps to avoid + // ambiguities when a stdlib implementation dispatches on a + // function which is overloaded on both input_iterator_tag and + // output_iterator_tag, as STLPort does, in its __valid_range + // function. I claim it's better to avoid the ambiguity in these + // cases. + operator std::output_iterator_tag() const + { + return std::output_iterator_tag(); + } +}; // // True iff the user has explicitly disabled writability of this