diff --git a/src/google/protobuf/repeated_field.h b/src/google/protobuf/repeated_field.h index 0515e01441..2552e232c2 100644 --- a/src/google/protobuf/repeated_field.h +++ b/src/google/protobuf/repeated_field.h @@ -2282,14 +2282,23 @@ namespace internal { // This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin // (jyasskin@google.com). template -class RepeatedPtrIterator { +class RepeatedPtrIterator + : public std::iterator< + std::random_access_iterator_tag, Element> { public: typedef RepeatedPtrIterator iterator; - typedef std::random_access_iterator_tag iterator_category; + typedef std::iterator< + std::random_access_iterator_tag, Element> superclass; + + // Shadow the value_type in std::iterator<> because const_iterator::value_type + // needs to be T, not const T. typedef typename std::remove_const::type value_type; - typedef std::ptrdiff_t difference_type; - typedef Element* pointer; - typedef Element& reference; + + // Let the compiler know that these are type names, so we don't have to + // write "typename" in front of them everywhere. + typedef typename superclass::reference reference; + typedef typename superclass::pointer pointer; + typedef typename superclass::difference_type difference_type; RepeatedPtrIterator() : it_(NULL) {} explicit RepeatedPtrIterator(void* const* it) : it_(it) {} @@ -2369,14 +2378,21 @@ class RepeatedPtrIterator { // referenced by the iterator. It should either be "void *" for a mutable // iterator, or "const void* const" for a constant iterator. template -class RepeatedPtrOverPtrsIterator { +class RepeatedPtrOverPtrsIterator + : public std::iterator { public: typedef RepeatedPtrOverPtrsIterator iterator; - typedef std::random_access_iterator_tag iterator_category; + typedef std::iterator superclass; + + // Shadow the value_type in std::iterator<> because const_iterator::value_type + // needs to be T, not const T. typedef typename std::remove_const::type value_type; - typedef std::ptrdiff_t difference_type; - typedef Element* pointer; - typedef Element& reference; + + // Let the compiler know that these are type names, so we don't have to + // write "typename" in front of them everywhere. + typedef typename superclass::reference reference; + typedef typename superclass::pointer pointer; + typedef typename superclass::difference_type difference_type; RepeatedPtrOverPtrsIterator() : it_(NULL) {} explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {}