为什么我不能在 std::set 中的元素上调用非常量成员函数?
Why can't I call a non-const member function on an element in an std::set?
我有下一个代码:
set<Item> temp_items;
set < Item >::iterator it;
temp_items = user->second.get_items();
for (it = temp_items.begin(); it != temp_items.end(); it++)
{
if (counter == (choice - 1))
{
it->get_count();
}
}
我要调用的item函数是:
int Item::get_count() { return _count; }
这里没有任何const类型阻止我访问item对象,但我仍然得到下一条消息:
对象具有与成员函数
不兼容的类型限定符对象类型为const
我该如何修复它?
set
总是返回给您const
的对象。在您的循环中,*it
指的是const Item
。您正在尝试调用成员函数get_count()
,这不是const
限定的-它只允许在非const
对象上调用,因此失败。
const
:
来修复这个问题。int get_count() const { return _count; }
^^^^^^^
注意:你调用的函数没有副作用,也没有使用它的返回类型。这实际上什么也没做。
简而言之:只能在set迭代器上调用const函数。
解释:
该集合在内部按Item
排序。因此,当你访问一个引用(通过迭代器)时,你不允许做一些事情来改变Item
的值(这实际上很容易在早期的c++版本中实现)。
如果不小心改变了值,不会相应地改变内部的"排序",即使对象在理论上"存在",查找也可能失败。
想象一下对于数字你有一个集合
1 2 3 4 5 6 7 8 9
现在你把9的值改为0(通过引用)
1 2 3 4 5 6 7 8 0
现在,当你要寻找一个0,容器有一个智能查找,它会使用二进制搜索,并假设0在最左边。这将导致找不到0。
(注:这只是一个简化的例子。对于如何实现set没有明确的解释)
这就是为什么对键的引用是const
引用,以及为什么只能在这些引用上调用const函数(同样适用于map上的键)。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 一个关于在函数中运行未调用语句的非常奇怪的错误
- 非常奇怪的segfault调用winusb_getoverlappedresult
- 从对象调用成员对象,错误:引用非常量值的初始值必须是左值
- 导致CreateFile调用串行端口的速度非常慢的原因
- 非常具体的子类方法调用
- 帮助处理一个非常奇怪的COM+调用栈
- 阻止const类函数在引用成员上调用非常常量类函数