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

时间:2012-03-19 19:24:49

标签: 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;
    }
};

由于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;

1 个答案:

答案 0 :(得分:10)

两件事:

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

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

  3. 您的operator()应如下所示:

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