2016-03-27 15 views
2

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?

+0

@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. –

+0

Welcher Compiler/OS? Auch, was ist 'arr'? Bitte geben Sie eine [MCVE] an. – Barry

+0

Compiler g ++ 11 und OS ist debian Linux (Ubuntu) –

Antwort

2

Der Bediener wird < zu vergleichen zwei Objekte verwendet, und das Objekt, das durch Parameter übergeben wird nicht verändert werden, so muss der Parameter const sein.