2012-03-19 13 views
6

Tengo un problema al transferir mi functor de windows a linux. (Un funtor para pasar a STL :: mapa de un estricto orden débil) El original es el siguiente:Error: pasando const xxx como este argumento de xxx descarta calificadores

struct stringCompare{ // Utilized as a functor for stl::map parameter for strings 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(_stricmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 

Como _stricmp soporte para Linux duerma pero utiliza strcasecmp lugar, lo cambié a:

struct stringCompare{ 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(strcasecmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 

Y ahora se queja de parámetros "const":

passing const stringCompare as this argument of bool stringCompare::operator() 
(std::string, std::string)â discards qualifiers 

no estoy del todo seguro de por qué supone stringCompare debe ser una constante ...

Y la línea en la que está loco por lo cual se crea una instancia es: ser

if(masterList->artistMap.count(songArtist) == 0) 

artistMap un STL :: mapa con una clave de cadena.

No estoy seguro de dónde me estoy equivocando. Intenté cambiar los parámetros del operador bool() para const, ya que parece que se queja de algún tipo de paso de parámetro no constante. Esto no funcionó, ni cambió el 'bool operator()' a 'const bool operator()'.

Por lo que yo sé, strcasecmp es una función const, así que si pasara parámetros no constantes o constantes (c_str() también es const), entonces no estoy exactamente seguro de dónde me estoy equivocando .

He buscado en Google problemas similares, pero todavía no puedo entender el problema por lo que he visto tanto en stackoverflow como en otros lugares.

El tipo de datos donde yo estoy usando esto es:

map<string, set<song, setSongCompare>*,stringCompare > artistMap; 
+0

Quizás relacionada con 'calificador const' ?? ¿Se informa la advertencia en la declaración 'map' o en otro lugar? – Kashyap

+0

Es mucho mejor utilizar algoritmos de cadenas que son portátiles y operan en std :: string en lugar de const char *. hay uno para comparación case insensative. – 111111

+0

se informa en esta línea: if (masterList-> artistMap.count (songArtist) == 0) donde songArtist es una cadena – Glem

Respuesta

10

dos cosas:

  1. definir su bool operator() como const. Es solo una buena práctica. Esto le dice al compilador que esta función no tendrá efectos secundarios en las variables miembro de la clase.

  2. Agregue const & calificadores a los argumentos lhs y rhs. Pasar referencias constantes en lugar de copiar la memoria por todos lados también es una buena práctica. Al declarar referencias como const le está diciendo al compilador que esta función no debería tener efectos secundarios en los objetos a los que se hace referencia.

Su operator() debería tener el siguiente aspecto:

bool operator() (const string &lhs, const string &rhs) const 
{ 
    return strcasecmp(lhs.c_str(), rhs.c_str()) < 0; 
} 
+0

Como mencioné, Intenté esto y da el mismo resultado. – Glem

+1

@Glem No 'const bool operator() (...)' pero 'bool operator() (...) const' – Praetorian

+0

¡Pensé que lo había intentado de esta manera, pero supongo que no! Esto funcionó. ¿Por qué requiere const after parameters? No he visto esto antes. Además, ¿no debería, en teoría, no preocuparse por const si ninguna de las funciones internas son constantes? Solo para que pueda aclarar en mi cabeza por qué ocurrió el error. ¡Gracias! – Glem

Cuestiones relacionadas