C ++&#34;错误:传递&#39; const std :: map <int,std :: basic_string <char =“”>&gt;&#39;作为&#39;这个&#39; ...的参数&#34; </int,>

时间:2013-11-29 02:57:35

标签: c++ map const

使用以下代码(为简洁起见摘录):

color.h:

class color {
public:
    color();

    enum colorType {
        black, blue, green, cyan, red,
        magenta, brown, lightgray, nocolor
    };

    colorType getColorType();
    void setColorType(colorType cColortype);

    string getColorText() const;

private:
    colorType cColortype = nocolor;
    map<int, string> colors = {
        {black, "black"},
        {blue, "blue"},
        {green, "green"},
        {cyan, "cyan"},
        {red, "red"},
        {magenta, "magenta"},
        {brown, "brown"},
        {lightgray, "lightgray"},
        {nocolor, "nocolor"}};
};

color.cpp:

color::color() {
}

color::colorType color::getColorType() {
    return cColortype;
}

void color::setColorType(colorType cColortype) {
    this->cColortype = cColortype;
}

string color::getColorText() const {
    return colors[cColortype];
}

我收到以下错误:

  

color.cpp:16:29:错误:传递'const std :: map&gt;'作为'std :: map&lt; _Key,_Tp,_Compare,_ Alloc&gt; :: mapped_type&amp;的'this'参数std :: map&lt; _Key,_Tp,_Compare,_ Alloc&gt; :: operator [](std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: key_type&amp;&amp;)[with _Key = int; _Tp = std :: basic_string; _Compare = std :: less; _Alloc = std :: allocator&gt;取代; std :: map&lt; _Key,_Tp,_Compare,_Alloc&gt; :: mapped_type = std :: basic_string; std :: map&lt; _Key,_Tp,_Compare,_ Alloc&gt; :: key_type = int]'丢弃限定符[-fpermissive]

错误是指“返回颜色[cColortype];”在getColorText。

我正在为一个类项目编写这个,我可以通过删除getColorText签名中的const声明来使其工作,但我正在尝试学习/采用良好实践并坚持推荐使用const作为不修改数据的成员函数,所以我想知道如何处理这个问题。

我通常非常擅长调试/故障排除,但错误信息非常复杂,以至于没有多大帮助。

感谢任何帮助。

3 个答案:

答案 0 :(得分:33)

string color::getColorText() const {
    return colors[cColortype];
}

问题是您已将该功能标记为constoperator[]上的std::map被标记为非const,不能在这样的const函数中使用。您需要手动使用std::map::find(或其他机制)来搜索输入类型并处理未找到的情况。

如果你正在使用C ++ 11,你可以使用std::map::at,允许在常量映射上使用,如果请求的元素不存在则抛出异常。

答案 1 :(得分:5)

关键接近结束:“丢弃限定符”。 getColorTextconst成员函数,因此colorsconst。但map::operator[]()不是const

答案 2 :(得分:2)

首先:地图map<int, string> colors必须是从 cColorType 到字符串而不是int的地图:

map<cColorType, string> colors

第二:有些人已经回答:map::operator[]()不是const。原因是此运算符返回一个引用,允许您修改其值。

让我建议以下解决方案:您可以创建第二个私有属性:字符串格式的颜色。因此,您将拥有2个Get函数(每种颜色一个)和一个Set函数(将修改2个颜色属性)。