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()47 int main() { return 0; }
48 
49