1 // PR c++/81045 2 // { dg-do compile { target c++14 } } 3 4 template<typename T> class vectorIterator; 5 6 template<typename T> class vector { 7 public: get(unsigned int i)8 auto get(unsigned int i) { return data[i]; } 9 begin()10 auto begin() { return vectorIterator<T>{*this, 0}; } end()11 auto end() { return vectorIterator<T>{*this, 10}; } 12 13 private: 14 T data[10] = {}; 15 }; 16 17 template<typename T> class vectorIterator { 18 public: vectorIterator(vector<T> & self,unsigned int offset)19 vectorIterator(vector<T>& self, unsigned int offset) : self(self), offset(offset) {} 20 21 auto operator*() -> T& { return self.get(offset); } 22 auto operator!=(const vectorIterator& source) -> bool { return offset != source.offset; } 23 auto operator++() -> vectorIterator& { ++offset; return *this; } 24 25 private: 26 vector<T>& self; 27 unsigned int offset; 28 }; 29 30 class Object { 31 public: 32 template<typename T> auto cast() -> T { 33 return T(); 34 } 35 }; 36 37 class Group : public Object { 38 public: 39 template<typename T = Object> auto objects() const -> void { 40 vector<Object> easyObjects; 41 for(auto obj : easyObjects) { 42 auto casted = obj.cast<T>(); 43 } 44 } 45 }; 46 main()47int main() { return 0; } 48 49