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
两件事情:
定义你bool operator()的const.这只是一个很好的做法.这告诉编译器该函数不会对类的成员变量产生副作用.
将const &限定符添加到lhs和rhs参数.传递常量引用而不是在整个地方复制内存也是一种很好的做法.通过声明引用,因为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)