Unl_type not found

When I try to use std::distance with a custom iterator under gcc 4.7, it complains that it did not find the difference_type . Unfortunately, I do not know why this is failing.

 #include <iterator> class nit { public: typedef int difference_type; }; int main() { const nit test1; std::distance( test1, test1 ); return 0; } 

gives an error:

/usr/include/c++/4.7/bits/stl_iterator_base_funcs.h:114:5: error: no type named 'difference_type' in 'struct std::iterator_traits<nit>'

+7
source share
2 answers

Have you tried to define all the necessary types / operators?

 #include <iterator> struct nit { typedef std::random_access_iterator_tag iterator_category; typedef int value_type; typedef int difference_type; typedef int* pointer; typedef int& reference; bool operator==(nit const&) { return true; } bool operator!=(nit const&) { return false; } int operator-(nit const&) { return 0; } nit() { } }; int main() { nit const test1; std::distance(test1, test1); return 0; } 
+3
source

Either you must provide all typedef (with or without std :: iterator) in your class that std :: iterator_traits are expecting, or you should specialize in std :: iterator_traits yourself.

This version of GCC gives other error messages, but it does not alter the fact that your code is illegal.

 prog.cpp: In function 'int main()': prog.cpp:9: error: uninitialized const 'test1' /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++v4/bits/stl_iterator_base_types.h: At global scope: /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_types.h: In instantiation of 'std::iterator_traits<nit>': prog.cpp:10: instantiated from here /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_types.h:133: error: no type named 'iterator_category' in 'class nit' /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_types.h:134: error: no type named 'value_type' in 'class nit' /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_types.h:136: error: no type named 'pointer' in 'class nit' /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_types.h:137: error: no type named 'reference' in 'class nit' /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_funcs.h: In function 'typename std::iterator_traits<_Iterator>::difference_type std::distance(_InputIterator, _InputIterator) [with _InputIterator = nit]': prog.cpp:10: instantiated from here /usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_iterator_base_funcs.h:119: error: no matching function for call to '__iterator_category(nit&)' 
0
source

All Articles