错误:传递'constas'这个'参数丢弃限定符[-fpermissive]

时间:2016-05-06 03:53:48

标签: c++ c++11

我有一个单身人士课程:

class ObjectModel {
public:
    virtual ~ObjectModel();
    static ObjectModel& Get();

    const AttributeStruct operator [] (const std::string &symbol_path) const {
        auto path = split(symbol_path, '.');

        if (path.size() != 2) {
            throw std::runtime_error(Formatter() << "Path '" 
               << symbol_path << "' has a wrong format.");
        }

        const CipAttributeStruct attr = this->dic[path[0]][path[1]];
        if (attr.data == nullptr) {
            throw std::runtime_error(Formatter() << "Attribute '" 
               << symbol_path << "' isn't found.");
        }

        return attr;
    }
private:
    ObjectModel();
    ObjectModel( const ObjectModel& );
    ObjectModel& operator=( ObjectModel& );

    std::map<std::string, std::map<std::string, CipAttributeStruct> > dic = {};
};

用法:

void main() {
    auto &m = ObjectModel::Get();

    std::cout << *static_cast<uint32_t*>(m["Object1.Attribute"].data);
}

由于错误,我无法编译此代码:

  

错误:传递'const std :: map,std :: map,lynx :: cip :: CipAttributeStruct&gt; &gt;'as'这个'参数丢弃限定符[-fpermissive]     const CipAttributeStruct attr = this-&gt; dic [path [0]] [path [1]];

我在这里看到很多这类问题,但没有一个能帮助我。我知道我可以删除 const 限定符来避免这个问题。但我想知道是否还有其他方法。

2 个答案:

答案 0 :(得分:1)

由于ETag可能具有破坏性,因此不是Size操作。如果您只想观察地图内容,请使用operator[]

const

答案 1 :(得分:0)

我可以想到几种可以解决问题的方法。

  1. 使用std::map::at()。如果使用std::map::at(),则必须添加代码以捕获异常。如果没有与该键对应的项目,std::map::at()将抛出异常。

    const CipAttributeStruct attr = nullptr;
    try
    {
       attr = this->dic.at(path[0]).at(path[1]);
    }
    catch (...)
    {
       // Deal with missing key
    }
    
  2. 使用std::map::find并处理不存在的密钥。

    auto it1 = this->dic.find(path[0]);
    if ( it1 == this->dic.end() )
    {
       // Deal with missing key
    }
    
    auto it2 = (*it1).find(path[1]);
    if ( it2 == (*it1).end() )
    {
       // Deal with missing key
    }
    
    const CipAttributeStruct attr = it2->second;