Kompilator nie znajduje operatora w specyficznym przypadku.

0

Poniższy kod:

#include <utility>
#include <algorithm>
#include <vector>
#include <tuple>
#include <unordered_map>

using namespace std;

using liczba = pair<int, float>;
using xxx = unordered_map<int, char>;
using dar = pair<liczba, xxx::iterator>;

bool operator< (const dar& d1, const dar& d2)
{
	return true;
}

int main()
{
	vector<dar> dary;
	dar d;
	dary.push_back(d);
	dary.push_back(d);
	dary.push_back(d);
	dary.push_back(d);
	dary.push_back(d);
	sort(dary.begin(), dary.end());
}

nie kompiluje się (https://ideone.com/Zyg8Fk). W czym jest problem? Gdy zamiast

using dar = pair<liczba, xxx::iterator>; 

będzie

using dar = pair<liczba, vector<int>::iterator>; 

wszystko działa.

1

http://en.cppreference.com/w/cpp/utility/pair/operator_cmp

std::pair definiuje własny operator<. Ponieważ std::unordered_map jest mapą, jej iterator nie implementuje operatora<, co powoduje błąd kompilacji operatora< pary.

Możesz wywołać swój operator explicite: sort(dary.begin(), dary.end(), static_cast<bool(*)(const dar&, const dar&)>(&operator<)); Przy czym musisz pamiętać, że Twoja implementacja pozostawia wiele do życzenia - wedle standardu jeśli a>b == true to b>a == false.

https://ideone.com/8EegLb

0

Rozumiem, oczywiście operator jest łopatologiczny i niepoprawny dla celów edukacyjnych :) Czy nie istnieje sposób na przeładowanie tego standardowego operatora< pary? Czy trzeba zrobić własną klasę zamiast using-a i przeładować operator już tam? Pochodzi to z zadania, w którym "nie możemy definiować własnych struktur i klas"...

0

Bezpośrednio - nie, ale można poprzez operatory< elementów pary. Np. pair<Nazwisko, Imie> najpierw porówna nazwisko, a dopiero jeśli nazwiska są identyczne porówna imiona.

Jeśli nie możesz definiować własnych struktur i klas to możesz definiować funkcje (nawet to zrobiłeś wyżej, tyle, że nazwałeś funkcję operator<).

https://ideone.com/HWsEnw

0

Jasne. Wielkie dzięki! Got to love C++...

0
kq napisał(a):

Bezpośrednio - nie

Da się to się nazywa specjalizacja!
https://ideone.com/4Nqs5Y
Osobiście uważam to za durne rozwiązanie (jak wszelkie ingerencje w standardowe biblioteki) i lepiej podawać funkcję porównującą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1