C ++“错误:C++ “error: passing ‘const std::map >’ as ‘this’ argument of …”

C++ “error: passing 'const std::map<int, std::basic_string<char> >' as 'this' argument of …”

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

颜色:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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"}};
};

CPP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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: error: passing 'const std::map >' as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = int; _Tp = std::basic_string; _Compare = std::less; _Alloc = std::allocator > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::basic_string; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]' discards qualifiers [-fpermissive]

错误引用getcolorText中的"返回颜色

1
2
3
"。</P><P>我是为一个类项目写这个的,我可以通过删除getcolortext签名中的const声明来让它为分配工作,但是我正在尝试学习/采用好的实践,并坚持对不修改数据的成员函数使用const的建议,所以我想知道如何处理这个问题。</P><P>我通常非常擅长调试/故障排除,但错误消息非常复杂,没有太多帮助。</P><P>感谢您的帮助。</P><div class="suo-content">[collapse title=""]<ul><li>我的第一个建议是使用std::map<>::find调用适当地删除color::getcolorText()const中的下标运算符。</li></ul>[/collapse]</div><hr>[cc lang="cpp"]string color::getColorText() const {
    return colors[cColortype];
}

问题是您已经将函数标记为conststd::map上的operator[]标记为非常量,不能用于这样的常量函数。您需要手动使用std::map::find或其他机制来搜索输入类型并处理未找到的情况。

如果使用C++ 11,则可以使用EDCOX1 OR 4,它允许在常数映射中使用,如果请求的元素不存在,则抛出异常。


键接近结尾:"丢弃限定符"。getColorTextconst成员函数,所以colorsconst成员函数。但map::operator[]()不是const


第一:映射map colors必须是从cColorType到string的映射,而不是int:

1
map<cColorType, string> colors

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

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