2016-05-06 7 views
0

ich eine Singleton-Klasse haben:Fehler: ‚Constas 'this' vorbei Argument verwirft Qualifier [-fpermissive]

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 = {}; 
}; 

Verbrauch:

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

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

ich diesen Code nicht aufgrund eines kompilieren Fehler:

error: passing ‘const std::map, std::map, lynx::cip::CipAttributeStruct> >’ as ‘this’ argument discards qualifiers [-fpermissive] const CipAttributeStruct attr = this->dic[path[0]][path[1]];

Ich sehe viele Fragen dieser Art hier, aber keiner von ihnen hilft mir. Ich weiß, dass ich const Qualifier entfernen kann, um das Problem zu vermeiden. Aber ich frage mich, ob es einen anderen Weg gibt.

Antwort

0

ich paar Möglichkeiten denken können Sie Ihr Problem lösen können.

  1. Verwenden Sie std::map::at(). Wenn Sie std::map::at() verwenden, müssen Sie Code zum Abfangen von Ausnahmen hinzufügen. Wenn dem Schlüssel kein Element entspricht, löst std::map::at() eine Ausnahme aus.

    const CipAttributeStruct attr = nullptr; 
    try 
    { 
        attr = this->dic.at(path[0]).at(path[1]); 
    } 
    catch (...) 
    { 
        // Deal with missing key 
    } 
    
  2. Verwendung std::map::find und befassen sich mit nicht vorhandenen Schlüssel.

    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; 
    
1

Da operator[] potenziell destruktiv ist, ist es kein const Betrieb. Wenn Sie nur wollen den Inhalt der Karte beobachten, verwenden at:

const CipAttributeStruct attr = this->dic.at(path[0]).at(path[1]); 
Verwandte Themen