2011-10-23 8 views
9
#include <iostream> 
#include <vector> 
#include <algorithm> 
class MyData 
    { 
    public: 
     int m_iData; 
     bool operator<(MyData rhs) { return m_iData < rhs.m_iData; } 
    }; 

int main() 
{ 
    std:: vector <MyData> myvector(2, MyData()); 
    myvector[0].m_iData=2; myvector[1].m_iData=4; 

    std::sort(myvector.begin(), myvector.end()); 
} 

Intentar compilar esto da:Error: pasar 'const T' como 'esto' argumento de 'bool T :: operador <(T)' descarta calificadores

error: passing 'const MyData' as 'this' argument of 'bool MyData::operator<(MyData)' 
discards qualifiers 
+0

Cambie el '--' en el título a' T'. Me costó entender la pregunta. (No sé por qué no tengo un botón de edición en esta pregunta, sin embargo ...) – kay

Respuesta

17

Se llamará al operador de comparación en una referencia const de una instancia de clase, por lo que se debe declarar como una función miembro miembro.

También es una buena práctica para pasar el argumento const referencia y no por valor, a pesar de que no hace mucha diferencia para su clase simple:

bool operator<(const MyData & rhs) const { return m_iData < rhs.m_iData; } 
//    ^^^^^^^^^^^^^^  ^^^^^ 
//    if you like   mandatory 

Por lo general se recomienda declare todas las funciones del miembro constantes que no mutan su objeto. Esto no solo comunica su intención y diseño, sino que tampoco sería posible utilizar esas funciones en objetos o referencias constantes.

5

Un operator< debería ser const para ambos argumentos:

bool operator<(MyData const& rhs) const { return m_iData < rhs.m_iData; } 
+0

Funcionó, gracias. Buena pista sobre la referencia también. No había pensado en eso. –

0

Usted debe escribir un operador con const operandos. Eche un vistazo here.

Cuestiones relacionadas