我有一个问题将我的仿函数从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;
}
};
现在它正在抱怨“const”参数:
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是一个const函数,所以不管我是否传递非常量或常量参数(c_str()也是const),所以我不确定我哪里出错了。
我已经搜索过类似的问题但我仍然无法理解我在stackoverflow和其他几个地方看到过的问题。
我正在使用它的数据类型是:
map<string, set<song, setSongCompare>*,stringCompare > artistMap;
答案 0 :(得分: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;
}