2012-03-19 30 views
6

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; 
+0

Być może związane z 'const' eliminacjach ?? Czy ostrzeżenie jest zgłaszane w deklaracji 'map' lub w innym miejscu? – Kashyap

+0

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

+0

jest zgłaszany w tej linii: jeśli (masterList-> artistMap.count (songArtist) == 0) gdzie songArtist jest ciągiem – Glem

Odpowiedz

10

dwie rzeczy:

  1. zdefiniować bool operator() jak const. To tylko dobra praktyka. To mówi kompilatorowi, że ta funkcja nie będzie miała skutków ubocznych dla zmiennych składowych klasy.

  2. Dodaj const & kwalifikatorów do argumentów lhs i rhs. Przekazywanie stałych odniesień zamiast kopiowania pamięci w każdym miejscu jest również dobrą praktyką. Deklarując referencje jako const mówisz kompilatorowi, że ta funkcja nie powinna wywoływać skutków ubocznych na przywoływanych obiektach.

Twój operator() powinien wyglądać następująco:

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

Tak jak wspomniałem, próbował tego i daje ten sam rezultat. – Glem

+1

@Glem Nie 'const bool operator() (...)' ale 'bool operator() (...) const' – Praetorian

+0

Myślałem, że próbowałem to w ten sposób, ale przypuszczam, że nie! To zadziałało. Dlaczego po parametrach wymaga stałej? Nie widziałem tego wcześniej. Co więcej, czy w teorii nie powinno się martwić, jeśli żadna z wewnętrznych funkcji nie jest stała? Po prostu mogę wyjaśnić w mojej głowie, dlaczego wystąpił błąd. Dziękuję Ci! – Glem

Powiązane problemy