Ich habe Grafikalgorithmen codiert und ich kam auf dieses Problem. In C++ 11 Ich habe versucht, eine Struktur wie unten kompiliertC++ Funktion Überladen mit "Konstante"
struct edges{
int u , v , w ;
edges(){}
edges(int _u , int _v , int _w) {
u = _u , v = _v , w = _w ;
}
bool operator < (edges & r) {
return w < r.w ;
}
};
Also, ich diesen Code schrieb, es erfolgreich zu erstellen. Aber wenn ich rufe std :: sort() Funktion wie unten,
sort(arr , arr + M) ; // here arr is an array of edges with M elements
Dann bekomme ich Kompilierungsfehler, die zeigt auf stl_algo.h Zeilennummer . Ich füge den Teil des Codes von stl_algo.h,
/// This is a helper function...
template<typename _RandomAccessIterator, typename _Tp>
_RandomAccessIterator
__unguarded_partition(_RandomAccessIterator __first,
_RandomAccessIterator __last, const _Tp& __pivot)
{
while (true)
{
while (*__first < __pivot) // 2242 number line
++__first;
--__last;
while (__pivot < *__last)
--__last;
if (!(__first < __last))
return __first;
std::iter_swap(__first, __last);
++__first;
}
}
Also ich finde Lösung im Internet und bekam ein. Ich habe den Bediener mit wie unter const Stichwort zu überlasten,
struct edges{
int u , v , w ;
edges(){}
edges(int _u , int _v , int _w) {
u = _u , v = _v , w = _w ;
}
bool operator < (const edges & r) const {
return w < r.w ;
}
};
Meine Frage ist, warum ich den Operator mit Schlüsselwort ‚const‘ überlastet, wenn ich std rufen :: sort() Funktion?
@SamVarshavchik Ich konnte jedoch keine solche Anforderung im Standard finden. Der nächste, der kommt, ist 'Es wird angenommen, dass comp keine nichtkonstante Funktion über den dereferenzierten Iterator anwendet. Es sieht für mich wie ein Implementierungsfehler aus, dass' __pivot' zu 'const' gemacht wird. –
Welcher Compiler/OS? Auch, was ist 'arr'? Bitte geben Sie eine [MCVE] an. – Barry
Compiler g ++ 11 und OS ist debian Linux (Ubuntu) –