2012-11-12 9 views
7

Quando si tenta di utilizzare std::distance con un iteratore personalizzato in gcc 4.7, si lamenta di non trovare il difference_type. Purtroppo non ho idea del perché fallisca.difference_type non trovato

#include <iterator> 

class nit { 
public: 
    typedef int difference_type; 
}; 

int main() { 
    const nit test1; 
    std::distance(test1, test1); 
    return 0; 
} 

dà l'errore:

/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>’

+0

Qui potrebbe essere la soluzione: http://www.cplusplus.com/forum/general/11428/. –

+1

Provate ad ereditare la vostra classe da un'istanza di ['std :: iterator'] (http://en.cppreference.com/w/cpp/iterator/iterator). Posso immaginare che 'std :: iterator_traits' è specializzato solo per cose che ereditano da questo. –

+0

Inoltre, posso andare oltre con 'class nit: public std :: iterator ', ma 'T' deve essere un tipo non vuoto, e devi fornire un 'operator-' perché funzioni. In alternativa puoi avere un 'bidirectional_iterator_tag', ma poi devi fornire incrementori e comparatori. –

risposta

3

Hai provato la definizione di tutti i tipi/operatori richiesti?

#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; 
} 
0

entrambi i casi, è necessario fornire tutte le typedef (con o senza l'aiuto di std :: iterator) nella classe che std :: iterator_traits si aspetta o si deve specializzare std :: iterator_traits te stesso.

This version di GCC emette altri messaggi di errore ma non modifica il fatto che il codice sia illegale.

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&)’