我有一个单身人士课程:
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 限定符来避免这个问题。但我想知道是否还有其他方法。
答案 0 :(得分:1)
由于ETag
可能具有破坏性,因此不是Size
操作。如果您只想观察地图内容,请使用operator[]
:
const
答案 1 :(得分:0)
我可以想到几种可以解决问题的方法。
使用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
}
使用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;