У меня проблема с портированием моего функтора из 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;
}
};
И теперь он жалуется на "константные" параметры:
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 operator() на const, так как кажется, что он жалуется на передачу какого-то непостоянного параметра. Это не сработало, равно как и изменение 'bool operator()' на 'const bool operator()'.
Насколько я знаю, strcasecmp является константной функцией, поэтому она должна определять, передаю ли я ей непостоянные или постоянные параметры (c_str() также является константой), поэтому я не совсем уверен, где я ошибаюсь.
Я гуглил похожие проблемы, но до сих пор не могу понять суть проблемы из того, что я видел как на stackoverflow, так и в паре других мест.
Тип данных, где я использую это:
map<string, set<song, setSongCompare>*,stringCompare > artistMap;