diff --git a/src/util/range.hpp b/src/util/range.hpp
index 7777444d0f65d7feebc03f8f3e988a234462cdf6..2439ca74ee785fac1f909e92b3189bbfcd6f5da2 100644
--- a/src/util/range.hpp
+++ b/src/util/range.hpp
@@ -87,9 +87,9 @@ struct range {
         std::swap(right, other.right);
     }
 
-    decltype(*left) front() const { return *left; }
+    auto front() const -> decltype(*left) { return *left; }
 
-    decltype(*left) back() const { return *upto(left, right); }
+    auto back() const -> decltype(*left) { return *upto(left, right); }
 
     template <typename V = iterator>
     enable_if_t<is_random_access_iterator<V>::value, decltype(*left)>
@@ -200,7 +200,7 @@ public:
 
     // forward and input iterator requirements
 
-    auto operator*() const -> decltype(*iter()) { return *iter(); }
+    auto operator*() const -> decltype(*(this->iter())) { return *iter(); }
 
     I operator->() const { return e_.template ptr<0>(); }
 
@@ -271,7 +271,7 @@ public:
         return iter()-x.iter();
     }
 
-    auto operator[](difference_type n) const -> decltype(*iter()){
+    auto operator[](difference_type n) const -> decltype(*(this->iter())) {
         return *(iter()+n);
     }