我有下一个代码:
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();
}
}
我试图调用的项目功能是:
int Item::get_count() { return _count; }
我在这里没有任何const类型可以阻止我访问item对象,但仍然,我收到了下一条消息:
该对象具有与成员函数
不兼容的类型限定符对象类型是const
我该如何解决?
答案 0 :(得分:1)
set
始终会为您提供const
的对象。在您的循环中,*it
指的是const Item
。您正在尝试调用不是get_count()
限定的成员函数const
- 只允许在非const
对象上调用它,因此失败。
您可以通过标记您的函数const
:
int get_count() const { return _count; }
^^^^^^^
注意:您正在调用一个没有副作用且不使用其返回类型的函数。这实际上并没有做任何事情。
答案 1 :(得分:0)
简而言之:你只能在set迭代器上调用const函数。
<强>解释强>
该集在内部按Item
排序。因此,当您访问引用(通过迭代器)时,您不允许执行某些操作来更改Item
的值(这在早期的c ++版本中实际上很容易实现)。
当您意外更改值时,会发生什么情况,这不会改变内部&#34;订购&#34;相应地,即使对象是&#34;那么&#34;查找也会失败。在理论上。
想象一下这个数字你有一套
1 2 3 4 5 6 7 8 9
现在您将9的值更改为0(通过引用)
1 2 3 4 5 6 7 8 0
现在当你寻找一个0并且容器有一个智能查找时,它将使用二进制搜索并假设0在最左边。这将导致0未找到。
(注意:这只是一个简化的例子。没有明确说明如何实现一套)
这就是为什么对键的引用是const
引用以及为什么你只能在那些上调用const函数(同样适用于地图上的键)。