Mam problem z przeniesieniem mojego funktora z systemu Windows na system Linux. (A funktor przejść do stl :: mapie ścisłego-słaby zamawiającego) Oryginał jest w następujący sposób:Błąd: przekazywanie stałej xxx jako argumentu kwalifikatorów xxx discards
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;
}
};
jako wsparcie linux nie robi _stricmp ale używa strcasecmp zamiast tego zmieniłem go na adres:
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;
}
};
a teraz narzeka „const” parametrów:
passing const stringCompare as this argument of bool stringCompare::operator()
(std::string, std::string)â discards qualifiers
nie jestem do końca pewien, dlaczego zakłada stringCompare powinny być stałym ...
i linii gdzie jest wściekły o to jest instancja jest:
if(masterList->artistMap.count(songArtist) == 0)
artistMap bycia stl :: Mapa z kluczem smyczkowy.
Nie jestem pewien, gdzie idę źle. Podjęto próbę zmiany parametrów operatora bool() na const, ponieważ wygląda na to, że narzeka on na pewien rodzaj nieustalonego przekazywania parametrów. To nie zadziałało, ani nie zmieniło operatora bool() na "const bool operator()".
O ile mi wiadomo, strcasecmp jest funkcją const, więc powinienem podać przypadek, czy przekazuję jej parametry niestałe, czy stałe (c_str() również będące stałymi), więc nie jestem do końca pewien, gdzie idę źle .
Mam podobne problemy z Google, ale nadal nie mogę zrozumieć tego problemu z tego, co widziałem zarówno na stackoverflow, jak i kilku innych miejscach.
Typ danych, gdzie używam to:
map<string, set<song, setSongCompare>*,stringCompare > artistMap;
Być może związane z 'const' eliminacjach ?? Czy ostrzeżenie jest zgłaszane w deklaracji 'map' lub w innym miejscu? – Kashyap
Jesteś o wiele lepiej wykorzystując algorytmy ciągów, które są przenośne i działają na std :: string zamiast const char *. jest jeden dla porównania niewrażliwego na wielkość liter. – 111111
jest zgłaszany w tej linii: jeśli (masterList-> artistMap.count (songArtist) == 0) gdzie songArtist jest ciągiem – Glem