From 7745f69013b5e4c93c1ffe6ba3173456d45c7222 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 3 Dec 2019 14:40:15 +0100 Subject: bug #1776: fix vector-wise STL iterator's operator-> using a proxy as pointer type. This changeset fixes also the value_type definition. --- Eigen/src/Core/StlIterators.h | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) (limited to 'Eigen/src/Core/StlIterators.h') diff --git a/Eigen/src/Core/StlIterators.h b/Eigen/src/Core/StlIterators.h index 4f25a60c4..0d8bd1aa3 100644 --- a/Eigen/src/Core/StlIterators.h +++ b/Eigen/src/Core/StlIterators.h @@ -241,17 +241,30 @@ protected: typedef typename internal::conditional::type SubVectorType; typedef typename internal::conditional::type ConstSubVectorType; + +public: + typedef typename internal::conditional::type reference; + typedef typename reference::PlainObject value_type; + +private: + class subvector_stl_iterator_ptr + { + public: + subvector_stl_iterator_ptr(const reference &subvector) : m_subvector(subvector) {} + reference* operator->() { return &m_subvector; } + private: + reference m_subvector; + }; public: - typedef typename internal::conditional::type value_type; - typedef value_type* pointer; - typedef value_type reference; + + typedef subvector_stl_iterator_ptr pointer; subvector_stl_iterator() : Base() {} subvector_stl_iterator(XprType& xpr, Index index) : Base(xpr,index) {} - reference operator*() const { return (*mp_xpr).template subVector(m_index); } - reference operator[](Index i) const { return (*mp_xpr).template subVector(m_index+i); } - pointer operator->() const { return &((*mp_xpr).template subVector(m_index)); } + reference operator*() const { return (*mp_xpr).template subVector(m_index); } + reference operator[](Index i) const { return (*mp_xpr).template subVector(m_index+i); } + pointer operator->() const { return (*mp_xpr).template subVector(m_index); } }; } // namespace internal -- cgit v1.2.3