2011-11-28 13 views
8

Próbuję skompilować bibliotekę ZipStream, jest to efektywne opakowanie C++ dla zlib.Nie można przekonwertować z jednego typu iteratora na inny, ale oba są dokładnie takie same

Teraz jestem w punkcie, gdzie dostaję dwa błędy kompilacji na te dwie linie:

std::set<file_info_32*, sort_by_offset>::iterator first = _core->_entries_by_name.begin(); 
std::set<file_info_32*, sort_by_offset>::iterator last = _core->_entries_by_name.end(); 

błędy są:

Error 15 error C2440: 'initializing': nie można przekonwertować z
'std::_Tree_const_iterator<_Mytree>' do
'std::_Tree_const_iterator<_Mytree>' c: \ Users \ ahakeem \ pulpit \ zipstream \ ziparchive.cpp 423 1 zipstream
Error 16 error C2440: 'initializing': nie można przekonwertować z
'std::_Tree_const_iterator<_Mytree>' do
'std::_Tree_const_iterator<_Mytree>' C: \ Users \ ahakeem \ Pulpit \ zipstream \ ziparchive.cpp 424 1 zipstream

Więc zasadniczo kompilator mówi, że nie może przelicz z 'std::_Tree_const_iterator<_Mytree>' na 'std::_Tree_const_iterator<_Mytree>'

Jakieś pomysły, dlaczego tak się dzieje i jak je naprawić?

edit: po dalsze dochodzenie Znalazłem że _core->entries_by_name.begin() jest zadeklarowana jako 'std::set<file_info_32*, sort_by_offset>', co jest oczywiście inconsistant z tym, co jej iterator stara się być przypisane do (std::set<file_info_32*, sort_by_offset>).

Przełączanie na _core->_entries_by_offset.begin(); działa, ponieważ _entries_by_offset jest typem zgodnym z tym, co cesjonariusz spodziewa się uzyskać.

Czy to oznacza, że ​​ktoś mógł złamać kod, nie zdał sobie z tego sprawy i przesłał go do źródła repo? A może ten scenariusz błędnego przypisania rzeczywiście się kompiluje w niektórych systemach?

+0

Const poprawność? Sprawdź, czy możesz znaleźć coś, co jest błędnie niestałe. –

+3

lub są różne '_Mytree's –

+0

@ K-ballo: Dobra rada! – ildjarn

Odpowiedz

4

Moje najlepsze przypuszczenie, klasy zastąpione _MyTree są różne.

Znajdź with _MyTree = SomeClass gdzieś na wyjściu tuż poniżej błędu.

Powiązane problemy