c++ - I inherit from std::iterator, but compiler does not recognise 'pointer' or 'reference' -
i in process of making custom iterator, puzzled on makes compiler not recognise pointer or reference typedefs in case of templated iterator implementation.
the following code compiles fine:
#include <iterator> struct : std::iterator<std::random_access_iterator_tag, int> { int *v; pointer operator-> () { return v; } reference operator* () { return *v; } }; but once templatize custom iterator errors:
#include <iterator> template <class t> struct it2 : std::iterator<std::random_access_iterator_tag, t> { t *v; pointer operator-> () { return v; } reference operator* () { return *v; } }; error: 'pointer' not name type note: (perhaps 'typename std::iterator<std::random_access_iterator_tag, t>::pointer' intended) error: 'reference' not name type ... 1> why can't compiler see pointer , reference definitions contained in std::iterator ?
according note, seems shouldn't have bothered using std::iterator struct, instead should have manually copied typedefs. seems error prone in case iterator or iterator_traits typedef in future.
2. how think should deal definition of these traits (pointer, reference etc.) ?
1> why can't compiler see pointer , reference definitions contained in std::iterator ?
because compiler cannot rule out attempting provide specialisation of std::iterator pointer , reference aren't type definitions, dependent names can never interpreted typedef @ template definition time.
2. how think should deal definition of these traits (pointer, reference etc.) ?
while explicitly qualifying them typename every time works, can instead declare them once such, , rely on 1 declaration in rest of it2 definition:
#include <iterator> template <class t> struct it2 : std::iterator<std::random_access_iterator_tag, t> { using base = std::iterator<std::random_access_iterator_tag, t>; using typename base::pointer; using typename base::reference; t *v; pointer operator-> () { return v; } reference operator* () { return *v; } };
Comments
Post a Comment