使用以下代码(为简洁起见摘录):
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作为不修改数据的成员函数,所以我想知道如何处理这个问题。
我通常非常擅长调试/故障排除,但错误信息非常复杂,以至于没有多大帮助。
感谢任何帮助。
答案 0 :(得分:33)
string color::getColorText() const {
return colors[cColortype];
}
问题是您已将该功能标记为const
。 operator[]
上的std::map
被标记为非const,不能在这样的const函数中使用。您需要手动使用std::map::find
(或其他机制)来搜索输入类型并处理未找到的情况。
如果你正在使用C ++ 11,你可以使用std::map::at
,允许在常量映射上使用,如果请求的元素不存在则抛出异常。
答案 1 :(得分:5)
关键接近结束:“丢弃限定符”。 getColorText
是const
成员函数,因此colors
为const
。但map::operator[]()
不是const
。
答案 2 :(得分:2)
首先:地图map<int, string> colors
必须是从 cColorType 到字符串而不是int的地图:
map<cColorType, string> colors
第二:有些人已经回答:map::operator[]()
不是const
。原因是此运算符返回一个引用,允许您修改其值。
让我建议以下解决方案:您可以创建第二个私有属性:字符串格式的颜色。因此,您将拥有2个Get函数(每种颜色一个)和一个Set函数(将修改2个颜色属性)。