2012-11-12 45 views
7

當我嘗試使用std::distance一個自定義的迭代器下GCC 4.7,它抱怨沒有找到difference_type。我很遺憾不知道爲什麼它失敗了。difference_type沒有找到

#include <iterator> 

class nit { 
public: 
    typedef int difference_type; 
}; 

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

給出了錯誤:

/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

嘗試從實例繼承類['標準:: iterator'(http://en.cppreference.com/w/cpp/iterator/iterator)。我可以想象,'std :: iterator_traits'只專門用於那些繼承它的東西。 –

+0

進一步說,我可以用'類尼特進一步得到:公衆的std ::迭代器<性病:: random_access_iterator_tag,T,int>的''但需要T'是一個非void類型,您需要提供'operator-'這個工作。或者,你可以有一個'bidirectional_iterator_tag',但你需要提供增量器和比較器。 –

回答

3

您是否嘗試過定義所需的所有類型/經營者?

#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期待,或者你有專門的std :: iterator_traits自己。

GCC的This version發出其他錯誤消息,但它不會改變的事實,你的代碼是非法的。

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