错误:传递const xxx,因为xxx的这个参数会丢弃限定符

Gle*_*lem 6 c++ parameters compiler-errors const functor

我有一个问题将我的仿函数从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;
    }
};
Run Code Online (Sandbox Code Playgroud)

由于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;
    }
};
Run Code Online (Sandbox Code Playgroud)

它现在抱怨"const"参数:

passing const stringCompare as this argument of bool stringCompare::operator()  
(std::string, std::string)â discards qualifiers
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么它假设stringCompare应该是一个常量...

它被实例化的疯狂之处在于:

if(masterList->artistMap.count(songArtist) == 0) 
Run Code Online (Sandbox Code Playgroud)

artistMap是一个带字符串键的stl :: map.

我不确定我哪里出错了.我试图将bool operator()参数更改为const,因为它似乎在抱怨某种非常量参数传递.这不起作用,也没有将'bool operator()'更改为'const bool operator()'.

据我所知,strcasecmp是一个const函数,所以如果我传递非常量或常量参数(c_str()也是const),所以我不确定我哪里出错了.

我已经搜索过类似的问题,但我仍然无法理解我在stackoverflow和其他几个地方看到过的问题.

我正在使用它的数据类型是:

map<string, set<song, setSongCompare>*,stringCompare > artistMap;
Run Code Online (Sandbox Code Playgroud)

Geo*_*sov 10

两件事情:

  1. 定义你bool operator()const.这只是一个很好的做法.这告诉编译器该函数不会对类的成员变量产生副作用.

  2. const &限定符添加到lhsrhs参数.传递常量引用而不是在整个地方复制内存也是一种很好的做法.通过声明引用,因为const您告诉编译器此函数不应对引用的对象产生副作用.

operator()应该看起来如下:

bool operator() (const string &lhs, const string &rhs) const 
{
  return strcasecmp(lhs.c_str(), rhs.c_str())  < 0;
}
Run Code Online (Sandbox Code Playgroud)