Ошибка: передача const xxx в качестве аргумента xxx отбрасывает квалификаторы - PullRequest
6 голосов
/ 19 марта 2012

У меня проблема с переносом моего функтора из windows в linux.(функтор для передачи в stl :: map для строгого-слабого упорядочения) Оригинал выглядит следующим образом:

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;
    }
};

Поскольку linux не поддерживает _stricmp, но вместо этого использует strcasecmp, я изменил его на:

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;
    }
};

И теперь он жалуется на параметры "const":

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

Я не совсем уверен, почему предполагается, что stringCompare должна быть константой ...

Истрока, где он без ума от этого экземпляра, выглядит следующим образом:

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

artistMap - это stl :: map со строковым ключом.

Я не уверен, где я ошибаюсь.Я попытался изменить параметры оператора bool () на const, так как кажется, что он жалуется на какую-то непостоянную передачу параметров.Это не сработало и не изменило bool operator () на const bool operator ().

Насколько я знаю, strcasecmp - это константная функция, поэтому следует ли передавать ее непостоянные или постоянные параметры (c_str () также является константой), поэтому я не совсем уверен, где я ошибаюсь.

Я гуглил подобные проблемы, но до сих пор не могу понять смыслпроблема из того, что я видел как в stackoverflow, так и в нескольких других местах.

Тип данных, где я использую это:

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

1 Ответ

10 голосов
/ 19 марта 2012

Две вещи:

  1. Определите ваш bool operator() как const. Это просто хорошая практика. Это говорит компилятору, что эта функция не будет иметь побочных эффектов для переменных-членов класса.

  2. Добавьте const & квалификаторы к аргументам lhs и rhs. Передача постоянных ссылок вместо того, чтобы копировать память повсюду, также является хорошей практикой. Объявляя ссылки как const, вы говорите компилятору, что эта функция не должна иметь побочных эффектов для ссылочных объектов.

Ваш operator() должен выглядеть следующим образом:

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