2017-03-21 12 views
1

왜이 코드가 컴파일되지 않습니까? 내가 std::vector에 대한 std::list을 변경하는 경우std :: map :: std :: list :: iterator 사용

#include <map> 
#include <list> 

int main() 
{ 
    typedef std::list<int>::iterator Iter; 

    std::map<Iter, Iter> m; 

    std::list<int> ints; 

    m[ints.begin()] = ints.begin(); 
} 

, 모든 작동합니다. 다음과 같이

오류 로그는 다음과 같습니다

|| "==== Building Practical (release) ====" 
|| main.cpp 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
|| C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_function.h: In instantiation of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::_List_iterator<int>]': 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|498 col 32| required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = std::_List_iterator<int>; _Tp = std::_List_iterator<int>; _Compare = std::less<std::_List_iterator<int> >; _Alloc = std::allocator<std::pair<const std::_List_iterator<int>, std::_List_iterator<int> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::_List_iterator<int>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::_List_iterator<int>]' 
main.cpp|12 col 19| required from here 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| error: no match for 'operator<' (operand types are 'const std::_List_iterator<int>' and 'const std::_List_iterator<int>') 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|64| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_pair.h|220 col 5| note: candidate: template<class _T1, class _T2> constexpr bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) 
||  operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_pair.h|220 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::pair<_T1, _T2>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|298 col 5| note: candidate: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&) 
||  operator<(const reverse_iterator<_Iterator>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|298 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|348 col 5| note: candidate: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&) 
||  operator<(const reverse_iterator<_IteratorL>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|348 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1089 col 5| note: candidate: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::move_iterator<_Iterator>&, const std::move_iterator<_IteratorR>&) 
||  operator<(const move_iterator<_IteratorL>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1089 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::move_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1095 col 5| note: candidate: template<class _Iterator> bool std::operator<(const std::move_iterator<_Iterator>&, const std::move_iterator<_Iterator>&) 
||  operator<(const move_iterator<_Iterator>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1095 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::move_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|60| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|1293 col 5| note: candidate: template<class _Key, class _Val, class _KeyOfValue, class _Compare, class _Alloc> bool std::operator<(const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&, const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&) 
||  operator<(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|1293 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4982 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) 
||  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4982 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4994 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) 
||  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4994 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|5006 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) 
||  operator<(const _CharT* __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|5006 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: mismatched types 'const _CharT*' and 'std::_List_iterator<int>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\tuple|39| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\array|242 col 5| note: candidate: template<class _Tp, unsigned int _Nm> bool std::operator<(const std::array<_Tp, _Nm>&, const std::array<_Tp, _Nm>&) 
||  operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\array|242 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::array<_Tp, _Nm>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|63| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\tuple|928 col 5| note: candidate: template<class ... _TElements, class ... _UElements> constexpr bool std::operator<(const std::tuple<_Args1 ...>&, const std::tuple<_Args2 ...>&) 
||  operator<(const tuple<_TElements...>& __t, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\tuple|928 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::tuple<_Args1 ...>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|61| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|1087 col 5| note: candidate: template<class _Key, class _Tp, class _Compare, class _Alloc> bool std::operator<(const std::map<_Key, _Tp, _Compare, _Alloc>&, const std::map<_Key, _Tp, _Compare, _Alloc>&) 
||  operator<(const map<_Key, _Tp, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|1087 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::map<_Key, _Tp, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|62| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_multimap.h|988 col 5| note: candidate: template<class _Key, class _Tp, class _Compare, class _Alloc> bool std::operator<(const std::multimap<_Key, _Tp, _Compare, _Alloc>&, const std::multimap<_Key, _Tp, _Compare, _Alloc>&) 
||  operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_multimap.h|988 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::multimap<_Key, _Tp, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\list|63| 0, 
||     from ../src/main.cpp:2: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_list.h|1836 col 5| note: candidate: template<class _Tp, class _Alloc> bool std::operator<(const std::__cxx11::list<_Tp, _Alloc>&, const std::__cxx11::list<_Tp, _Alloc>&) 
||  operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_list.h|1836 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::list<_Tp, _Alloc>' 
||  { return __x < __y; } 
||     ^
Practical.make|106| recipe for target 'obj/Release/main.o' failed 
|| mingw32-make.exe[1]: *** [obj/Release/main.o] Error 1 
makefile|16| recipe for target 'Practical' failed 
|| mingw32-make.exe: *** [Practical] Error 2 

StackOverflow의 내 메시지는 주로 코드, 그래서 내가 여기이 문장을 쓸 필요가 알려줍니다.

+2

오류 메시지에서 알 수 있듯이 : 목록 반복기를 연산자 <와 비교할 수 없습니다.

답변

8

std::list 반복기는 bidirectional iterators입니다. 그들은 random access iterators 같은 비교를 지원하지 않습니다.

std::map에 대해서는 으로 주문 했으므로으로되어 있기 때문에 비교가 필요합니다. 지도는 키순으로 정렬되며,이 정렬을 사용하려면 키를 비교할 수 있어야합니다. 주목할 것은 목록 반복자가 아닙니다.

주문을 원하지 않으면 대신 std::unordered_map을 사용하십시오. 한편 Angew가 지적한 것처럼 std::unordered_map해시 된 컨테이너이며 작동하려면 std::hash의 전문화가 필요합니다.

+2

정렬되지 않은 맵에는 손으로 직접 작성한 해더가 필요하다고 지적 할 수 있습니다. 기본적으로'std :: hash :: iterator> '가 제공됩니다. – Angew

+0

빠른 응답을 보내 주셔서 감사합니다! unordered_map을 사용하면 실제로 '해시'와 같은 단어로 오류가 컴파일됩니다. 해쉬 함수를 작성하기가 어렵습니까? 또는 더 나은, 난 그냥 표준에서 다른 데이터 구조를 사용합니다. – user3496846

+1

@ user3496846 우리가 당신이 다른 것을 찾거나 사용할 수 있도록 우리는 원래의 문제점이 무엇인지, 당신이 필요로하는 것이 무엇인지를 알아야합니다. 유스 케이스 란 무엇인가. 해당 정보를 포함하도록 질문을 편집 해 주시면 Google에서 도움을 드릴 수 있습니다. 적절한 해시 함수를 생성하는 방법에 대해서는 [표준 : 해시 전문화] (http://stackoverflow.com/a/18079061/440558)를 작성하는 방법을 알고 있지만 실제로 구현할 수는 없습니다. 아마도 iterator가 가리키는 데이터를 사용하십시오 ('return std :: hash () (* iterator)')? –