当前位置: 首页 > 知识库问答 >
问题:

C“错误:将'const std::map'作为…的'this'参数传递”

郎聪
2023-03-14

代码如下(为简洁起见摘录):

颜色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"}};
};

颜色cpp:

color::color() {
}

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

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

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

我得到以下错误:

颜色cpp:16:29:错误:传递“const std::map”

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

我写这篇文章是为了一个类项目,我可以通过删除getColorText签名中的const声明来让它工作,但我正在尝试学习/采用良好的实践,并遵循建议,在不修改数据的成员函数中使用const,所以我想知道如何处理这个问题。

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

感谢您的帮助。

共有3个答案

那开济
2023-03-14

第一:地图地图

map<cColorType, string> colors

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

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

诸葛奇玮
2023-03-14

关键就在最后:“放弃资格赛”getColorText是一个const成员函数,因此colorsconst。但是map::operator[]()不是const

陈瀚
2023-03-14
string color::getColorText() const {
    return colors[cColortype];
}

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

如果您使用的是C11,您可以使用std::map::at,它允许在常量映射上使用,如果请求的元素不存在,则会引发异常。

 类似资料:
  • 在gcc 5.4.0上,从const C std::map获取条目时无法编译。 这看起来类似于传递“const”。此参数丢弃限定符[-fppermissive],它是关于

  • 我有与这里、这里或这里相同的问题,除了我为参数和函数设置了const: 但我有同样的编译错误:

  • 错误:将“const A”作为“void A::hi()”的“this”参数传递会丢弃限定符[-fppermissive] 我不明白为什么会出现这个错误,我没有返回任何东西,只是传递了对象的引用,就是这样。 编辑 我用const correction修复了它,但是现在我试图在同一个方法中调用方法,我得到了同样的错误,但奇怪的是我没有传递这个方法的引用。 错误:将“const A”作为“void A

  • 这是我在这里的第一个问题! 我试图将一个Map作为参数从struts动作传递给一个报告。我已经在reportParameters映射中插入了映射,该映射将被传递给jrxml文件。 我的问题是这个Map是否可以在jrxml文件中检索。 更准确地说,我声明如下: 我想这样使用它: 这可能吗?因为我在应用程序服务器日志中不断收到此错误: 我的动作类如下: 任何提示都会有帮助!

  • 代码如下: 我假设错误发生在insert函数中,并且与参数初始化有关。 bintree.cpp:65:27:错误:使用删除的函数'std::unique_ptr<_tp,_dp>::unique_ptr(const std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]“tree.insert(tree.ro

  • 下面是一个基本的代码片段,我得到了一个错误: 错误:传递'constd::map 注意:我知道我可以在不使用的情况下删除点,但上面的代码片段只是一个更大问题的示例。 我检查了一些关于类似错误的问题: 错误:传递constd::映射 但在这两种情况下,都是因为被声明为。另一方面,我试图使用/访问的