Ich arbeite mit Standard-Container wie Vektor und Paar mit benutzerdefinierten Typen als Vorlage Argumente. Die meiste Zeit diese Template-Typen sind const qualifiziert, wie in:C++ - Konstante auf Template-Typ Parameter
std::vector<const std::pair<const customType, const double>>
Hash() Operatoren und Vergleichsoperatoren == und < definiert wurden.
Problem tritt auf, wenn ich solche Werte zu Standard-Bibliotheksfunktionen wie partial_sort_copy, partial_sort und löschen übergebe. Aus irgendeinem Grund versuchen diese Funktionen schließlich, Zuweisungen zu den gegebenen Typen zu machen, was schließlich aufgrund der Überlastung bei der Kompilierung fehlschlägt.
Gibt es eine Möglichkeit, die Konflikte auf Schablonentypen für Vektor und Paar zu werfen? D. h., Gießen vector<const myType>
bis vector<myType>
.
Vielen Dank im Voraus.
EDIT: Jetzt mit widersprüchlichen minimalen Beispielcode!
// Non-working code:
std::vector<const std::pair<const int, const double>> list{ { 3, 3. }, { 2, 2. }, { 1, 1. }, { 0, 0. } };
std::partial_sort(list.begin(), list.begin() + 2, list.end(), [](const std::pair<const int, const double>& x, const std::pair<const int, const double>& y){ return x.first < y.first; });
// This works, actually:
std::vector<std::pair<int, double>> list{ { 3, 3. }, { 2, 2. }, { 1, 1. }, { 0, 0. } };
std::partial_sort(list.begin(), list.begin() + 2, list.end(), [](const std::pair<int, double>& x, const std::pair<int, double>& y){ return x.first < y.first; });
Was es über meinen Code ist, dass die Standardbibliothek nicht gefallen hat?
Sie sollten wahrscheinlich nicht konstante Paare von const-Werten verwenden. Vielleicht würde es hilfreich sein, ein ADL-verfügbares 'swap' zu definieren, aber Sie müssen' std :: pair' ableiten, da es keine gute Idee ist, etwas in 'std' zu definieren. – bipll
danke für deine antwort. Ich werde ADL nachschlagen. – jvier
@bipll Es ist völlig erlaubt, Funktionsüberladung/Templates wie 'swap' und' hash' im std-Namespace zu definieren. – Johan