2012-11-12 5 views
7

std::distance을 gcc 4.7에서 사용자 정의 반복기로 사용하려고하면 difference_type을 찾지 못했다고 불평합니다. 나는 슬프게 왜 그것이 실패하는지 전혀 모른다.difference_type을 찾을 수 없음

/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

다음 해결책이 될 수 있습니다. http://www.cplusplus.com/forum/general/11428/. –

+1

클래스를 ['std :: iterator'] (http://en.cppreference.com/w/cpp/iterator/iterator) 인스턴스에서 상속 해보십시오. 나는'std :: iterator_traits'가 그 것을 상속받은 것에 대해서만 전문화되었다고 생각할 수 있습니다. –

+0

더 나아가,'class nit : public std :: iterator '로 더 얻을 수 있습니다 만,'T'는 void 형이 아니어야합니다. 이것이 작동하려면'operator-'. 양자 택일 적으로 당신은'bidirectional_iterator_tag'을 가질 수 있지만, 증분 자와 비교자를 제공해야합니다. –

답변

3

당신이 필요한 모든 종류의/연산자를 정의하는 시도 유무 :

#include <iterator> 

class nit { 
public: 
    typedef int difference_type; 
}; 

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

오류를 준다?

#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

하나, 당신은 (또는 표준 : : 반복자의 도움없이) 수 std 클래스의 :: iterator_traits 기대 모든 형식 정의를 제공해야하거나 표준이 :: 자신을 iterator_traits 전문으로합니다.

This version은 GCC의 다른 오류 메시지를 표시하지만 사용자 코드가 잘못된 것으로 변경되지 않습니다.

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