在c++中,当map指针被更改为值时,抛出限定符错误
discard qualifiers error when in C++ with map pointer is changed as value
我有这个(简化的)代码可以正常工作。
class T
{
map<string, int>* m;
public:
T()
{
m = new map<string, int>();
}
void get(const string& key, int& val) const
{
val = (*m)[key];
}
}
当我把指针改成value时,
class T
{
map<string, int> m;
public:
void get(const string& key, int& val) const
{
val = m[key];
}
};
我得到这个错误信息,是什么错了?
In member function 'void T::get(const string&, int&) const':
constTest.cpp:12:20: error: passing 'const std::map<std::basic_string<char>, int>'
as 'this' argument of 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& ...'
discards qualifiers [-fpermissive]
val = m[key];
^
由于get
方法是const
,所以包括m
在内的所有数据成员都被视为常量。然而,map
上的[]
运算符是而不是常数。使用at
方法代替,它有一个const
重载:
val = m.at(key);
在const
方法中,第一个容器的类型实际上变成了map<string, int>* const
(指针是const,而指针不是)。第二个容器的类型变为const map<string, int>
。
operator[]
要求对象为非const,因为如果找不到新元素,它可能必须进行变异才能添加新元素。因此,在第一种情况下,解引用指针仍然指向const函数中的非const容器,而在第二种情况下,容器本身被视为const。
如果您要查找的键不存在,您希望发生什么?如果你想创建它,你的get函数不能是const。
如果你不希望它被创建,然后使用地图的find
方法找到你想要的项目(或end()
,如果它不能被找到,然后决定合适的行为)。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'