浏览代码

Revert "Updating Iterators to be compatible with C++17 in MSVC"

Paul Yang 6 年之前
父节点
当前提交
12f8fe8911
共有 1 个文件被更改,包括 26 次插入10 次删除
  1. 26 10
      src/google/protobuf/repeated_field.h

+ 26 - 10
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
 // This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin
 // (jyasskin@google.com).
 // (jyasskin@google.com).
 template<typename Element>
 template<typename Element>
-class RepeatedPtrIterator {
+class RepeatedPtrIterator
+    : public std::iterator<
+          std::random_access_iterator_tag, Element> {
  public:
  public:
   typedef RepeatedPtrIterator<Element> iterator;
   typedef RepeatedPtrIterator<Element> 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<Element>::type value_type;
   typedef typename std::remove_const<Element>::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) {}
   RepeatedPtrIterator() : it_(NULL) {}
   explicit RepeatedPtrIterator(void* const* it) : it_(it) {}
   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
 // referenced by the iterator.  It should either be "void *" for a mutable
 // iterator, or "const void* const" for a constant iterator.
 // iterator, or "const void* const" for a constant iterator.
 template <typename Element, typename VoidPtr>
 template <typename Element, typename VoidPtr>
-class RepeatedPtrOverPtrsIterator {
+class RepeatedPtrOverPtrsIterator
+    : public std::iterator<std::random_access_iterator_tag, Element> {
  public:
  public:
   typedef RepeatedPtrOverPtrsIterator<Element, VoidPtr> iterator;
   typedef RepeatedPtrOverPtrsIterator<Element, VoidPtr> 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<Element>::type value_type;
   typedef typename std::remove_const<Element>::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) {}
   RepeatedPtrOverPtrsIterator() : it_(NULL) {}
   explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {}
   explicit RepeatedPtrOverPtrsIterator(VoidPtr* it) : it_(it) {}