Błąd podczas sortowania STL

Błąd podczas sortowania STL
mpaw
  • Rejestracja:ponad 9 lat
  • Ostatnio:2 dni
  • Postów:531
0
Kopiuj
/* KOD USUNIĘTY */

Dzień dobry. Mam następujący błąd i nie wiem czemu:

Kopiuj
error: no match for ‘operator<’ (operand types are ‘Edge’ and ‘Edge’)
       { return *__it1 < *__it2; }
                ~~~~~~~^~~~~~~~

Chodzi o funkcję myCompare. Czemu się czepia, przecież nie muszę definiować operatora w klasie/strukturze ani definiować obiektu funkcyjnego?

Dodam, że próbowałem zmienić znak na > ale to nic nie dało


That's all folks ;)
edytowany 3x, ostatnio: mpaw
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
1

});
Kompilujesz ten kod, który nam pokazujesz? Bo dla mnie ten ) jest tu kompletnie zbędny, ale powinien inny komunikat błędu pokazywać.


Zobacz pozostałe 9 komentarzy
enedil
Takie rzeczy się robi wyszukiwarką internetową, która nie zindeksuje tekstu z obrazka tak dokładnie.
kq
Ja myślę, że pytanie o pomoc na forum podczas samodzielnej pracy nad kodem to nic wstydliwego i prowadzący nie ma prawa za to nawet punktu odjąć. No ale moje myślenie swoje, a polskie uczelnie swoje.
mpaw
Ale po co Wam kod z obrazka, jak nie da się go skompilować? :P
enedil
Fragment, który dałeś się kompiluje. Coś musiało się złego zdarzyć.
kq
zdarzyło. Standardowo: MCVE, i link do {jak zadawac pytania na forum}
mpaw
  • Rejestracja:ponad 9 lat
  • Ostatnio:2 dni
  • Postów:531
0

Podam pełny komunikat:

Kopiuj
/usr/include/c++/7/bits/predefined_ops.h: In instantiation of ‘bool __gnu_cxx::__ops::_Iter_less_iter::operator()(_Iterator1, _Iterator2) const [with _Iterator1 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _Iterator2 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >]’:
/usr/include/c++/7/bits/stl_algo.h:4880:14:   required from ‘_OutputIterator std::__merge(_InputIterator1, _InputIterator1, _InputIterator2, _InputIterator2, _OutputIterator, _Compare) [with _InputIterator1 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _InputIterator2 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _OutputIterator = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _Compare = __gnu_cxx::__ops::_Iter_less_iter]’
/usr/include/c++/7/bits/stl_algo.h:4937:37:   required from ‘_OIter std::merge(_IIter1, _IIter1, _IIter2, _IIter2, _OIter) [with _IIter1 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _IIter2 = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >; _OIter = __gnu_cxx::__normal_iterator<Edge*, std::vector<Edge> >]’
main.cpp:266:99:   required from here
/usr/include/c++/7/bits/predefined_ops.h:43:23: error: no match for ‘operator<’ (operand types are ‘Edge’ and ‘Edge’)
       { return *__it1 < *__it2; }
                ~~~~~~~^~~~~~~~

That's all folks ;)
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
0

Zrobiłeś pełen rebuild? Wyraźnie komunikat nie jest z myCompare, bo wywoływane jest porównanie za pomocą <. MCVE byłoby najlepsze, szczególnie ze pewnie w połowie jego tworzenia byś znalazł błąd.


mpaw
Jak się robi rebuild? Sory, ja kompiluję w konsoli
mpaw
Program jest w jednym pliku
kq
To rzuć cały kod na PM
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
0

Tak swoją drogą:

Kopiuj
for (int j = i + 1; j < graph.size(); j++)

graf jest zawsze kwadratowy? Jak nie, to graph[i].size() chyba miało być.


enedil
Chyba jest kwadratowy, bo datatype to double
kq
Nie rozumiem skąd taka konkluzja na tej podstawie. Ale spoko, jak nie błąd to nie błąd.
enedil
Gdyby nie był, to przydałoby się jakieś wskazanie na to jaki identyfikator ma drugi wierzchołek, co nie jest racjonalne przy użyciu double (oczywiście być może przypadkiem te liczby są wszystkie całkowite).
mpaw
racja, był w zamyśle macierzą symetryczną
mpaw
a nie, dobrze jest, bo ja porzebuje unikatowe punkty, więc z racji, że macierz jest symetryczna, to wcztuje tylko te znad diagonalii
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
2

Ok, to tak na przyszłość: https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

Wkleiłeś błędny kawałek loga, istotny był ten:

Kopiuj
wb.cpp:264:100:   required from here

Który odnosi się do linii:

Kopiuj
merge(trees[i].begin(), trees[i].end(), trees[j].begin(), trees[j].end(), trees[i].begin());

Do merge też trzeba komparator, inaczej używa <.


mpaw
Aaaa! Dzięki! :)
mpaw
Ten STL fajna sprawa, tylko trzeba mieć oczy nawet w ...
mpaw
z tyłu głowy
kq
Przyznam, że jakość komunikatów kompilatora jest dość słaba ;​)
mpaw
Nie działa dodawanie obrazków. To chwilowe czy grubsza sprawa?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.